本文概述
- 从内存中的数据上传
- 从流上传
- 从本地文件上传
- 上传后获取下载网址
- 管理上传
文章图片
由于默认引擎应用, Google应用和Firebase共享此存储桶, 因此配置公共访问权限还可以使新上传的App Engine文件可以公开访问。设置身份验证时, 请确保再次访问我们的存储桶。
要将文件上传到Cloud Storage, 我们将首先创建对带有文件名的文件完整路径的引用。
// Create a storage reference from our appval storageRef = storage.reference// Create a reference to "mountains.jpg"val mountainsRef = storageRef.child("mountains.jpg")// Create a reference to 'images/mountains.jpg'val mountainImagesRef = storageRef.child("images/mountains.jpg")//When the file names are same, the references point to different filesmountainsRef.name == mountainImagesRef.name // truemountainsRef.path == mountainImagesRef.path // false
创建适当的引用后, 我们将调用putBytes(), putFile()或putStream()方法将文件上传到Cloud Storage。我们无法参考Google Cloud Storage存储桶的根目录上传数据。我们的参考必须指向子URL。
从内存中的数据上传 putBytes()方法是最轻松地将文件上传到Cloud Storage的最简单方法。 putBytes()方法使用byte []并返回一个UploadTask, 我们可以使用它来管理和监视上载的状态。
// Getting the data from an ImageView as bytesimageView.isDrawingCacheEnabled = trueimageView.buildDrawingCache()val bitmap = (imageView.drawable as BitmapDrawable).bitmapval baos = ByteArrayOutputStream()bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos)val data = http://www.srcmini.com/baos.toByteArray()var uploadTask = mountainsRef.putBytes(data)uploadTask.addOnFailureListener {// Handlling unsuccessful uploads}.addOnSuccessListener {// The taskSnapshot.metadata contains file metadata such as content-type, size, etc.// ...}
由于putBytes()接受byte [], 因此它要求我们的应用一次将文件的全部内容保存在内存中。我们认为putStream()或putFile()使用较少的内存。
从流上传 将文件上传到Cloud Storage的最灵活方法是使用putStream()方法。此方法采用InputStream并返回一个UploadTask, 它将用于管理和监视上载的状态。
val stream = FileInputStream(File("path/to/images/mountain.jpg"))uploadTask = mountainsRef.putStream(stream)uploadTask.addOnFailureListener {// Handling unsuccessful uploads}.addOnSuccessListener {// The taskSnapshot.metadata contains file metadata such as content-type, size, etc.// ...}
从本地文件上传 我们可以使用putFile()方法将本地文件上传到设备上。此方法将File作为输入, 并返回一个UploadTask, 我们可以使用它来管理和监视上载的状态。
var file = Uri.fromFile(File("path/to/images/rivers.jpg"))val riversRef = storageRef.child("images/${file.lastPathSegment}")uploadTask = riversRef.putFile(file)// Registering observers to listen for when the download is done or if it failsuploadTask.addOnFailureListener {// Handling unsuccessful uploads}.addOnSuccessListener {// The taskSnapshot.metadata contains file metadata such as content-type, size, etc.// ...}
上传后获取下载网址 要下载文件, 需要我们有一个URL。为了获取URL, 我们必须在StorageReference上调用getDownloadUrl()方法。
val ref = storageRef.child("images/mountains.jpg")uploadTask = ref.putFile(file)val urlTask = uploadTask.continueWithTask { task ->
if (!task.isSuccessful) {task.exception?.let {throw it}}ref.downloadUrl}.addOnCompleteListener { task ->
if (task.isSuccessful) {val downloadUri = task.result} else {// Handling failures// ...}}
管理上传 还有一些其他可用的方法, 例如pause(), resume()和cancel(), 可用于暂停, 恢复或取消上载。在暂停和恢复事件中, 暂停和进度状态分别发生变化。取消上载会导致上载失败, 并显示一个错误, 指示上载已被取消。
uploadTask = storageRef.child("images/mountains.jpg").putFile(file)// Pausing the uploaduploadTask.pause()// Resuming the uploaduploadTask.resume()// Canceling the uploaduploadTask.cancel()
完整的例子
【Firebase在云端存储中上传文件】带有进度监控和错误处理的上传示例如下:
// Getting File or Blobfile = Uri.fromFile(File("path/to/mountains.jpg"))// Creating the file metadatametadata = http://www.srcmini.com/StorageMetadata.Builder().setContentType("image/jpeg").build()// Uploading the file and the metadata to the path 'images/mountains.jpg'uploadTask = storageRef.child("images/${file.lastPathSegment}").putFile(file, metadata)// Listening for state changes, errors, and completion of the upload.uploadTask.addOnProgressListener { taskSnapshot ->
val progress = (100.0 * taskSnapshot.bytesTransferred) / taskSnapshot.totalByteCountprintln("Upload is $progress% done")}.addOnPausedListener {println("Upload is paused")}.addOnFailureListener {// Handling unsuccessful uploads}.addOnSuccessListener {// Handling successful uploads on complete// ...}
推荐阅读
- Firebase托管
- 从Cloud Storage下载文件
- Firebase在云存储中创建引用
- Firebase云存储设置和配置
- Firebase(云存储)
- 在Firestore中更新和删除
- 在Firestore中读写
- Firestore中的数据组织
- Firestore设置和配置