【发布时间】:2021-09-21 03:41:04
【问题描述】:
我一直在尝试将多张图片上传到Firebase 存储。但是,我无法成功地做到这一点。我可以成功地将图像(单个)上传到存储并将图像的 URL 添加到Firestore,现在我修改了我的代码以上传最多五张图像,它可以是从 1 到 5 的任意数量的图像。
R.id.btn_submit -> {
if (validateDetails()) {
uploadImage()
}
}
上面的代码,在验证字段后调用下面的函数,然后调用函数uploadImageToCloudStorage。 mSelectedImageFileUriList 是 private var mSelectedImageFileUriList: MutableList<Uri?>? = null。一切似乎都正常。
private fun uploadImage() {
showProgressDialog(resources.getString(R.string.please_wait))
FirestoreClass().uploadImageToCloudStorage(
this@AddProductActivity,
mSelectedImageFileUriList,
Constants.PRODUCT_IMAGE,
Constants.PRODUCT_IMAGE_DIRECTORY_NAME,
et_product_title.text.toString().trim { it <= ' ' }
)
}
下面的代码是我猜是错误的地方。
fun uploadImageToCloudStorage(
activity: AddProductActivity,
imageFileURI: MutableList<Uri?>?,
imageType: String,
directoryName: String,
title: String
) {
var i = 0
val imageURLList = ArrayList<String>()
val itr = imageFileURI?.iterator()
if (itr != null) {
while (itr.hasNext()) {
val sRef: StorageReference = FirebaseStorage.getInstance().getReference(
"/$directoryName/" + imageType + "." + Constants.getFileExtension(
activity,
imageFileURI[i]
)
)
sRef.putFile(imageFileURI[i]!!)
.addOnSuccessListener { taskSnapshot ->
taskSnapshot.metadata!!.reference!!.downloadUrl
.addOnSuccessListener { uri ->
if (i < imageFileURI.size) {
i += 1
imageURLList.add(uri.toString())
} else {
activity.imageUploadSuccess(imageURLList)
}
}
}
.addOnFailureListener { exception ->
activity.hideProgressDialog()
Log.e(
activity.javaClass.simpleName,
exception.message,
exception
)
}
}
} else {
Toast.makeText(
activity,
"There is no images in the ArrayList of URI",
Toast.LENGTH_SHORT
).show()
}
}
编辑:收到第一个答案后。
我创建了一个QueueSyn.kt 文件并在答案中添加了代码。图片和按钮更改为的活动
class AddProductActivity : BaseActivity(), View.OnClickListener, QueueSyncCallback {
点击按钮时会调用以下函数。
private fun uploadProductImage() {
showProgressDialog(resources.getString(R.string.please_wait))
QueueSync(
mSelectedImageFileUriList,
Constants.PRODUCT_IMAGE,
Constants.PRODUCT_IMAGE_DIRECTORY_NAME,
et_product_title.text.toString().trim { it <= ' ' },
this
).startUploading()
}
我在AddProductActivity类中也实现了这两个方法,但是不知道里面应该放什么。
override fun completed(successList: MutableList<Uri>, failureList: MutableList<Uri>) {
TODO("Not yet implemented")
}
override fun getFileExtension(uri: Uri): String {
TODO("Not yet implemented")
}
错误:
【问题讨论】:
-
有错误信息吗?如果有请编辑。
-
也许尝试一个一个发送文件
-
您在这里所做的是您的 while 循环正在遍历所有文件,并且在其中 Firebase 存储正在异步发送文件,这意味着在一个文件完全发送之前另一个文件开始上传。如果您有很长的文件列表,这种方式将无法维持。相反,您应该尝试使用递归解决方案来同步文件上传,因此一次只上传一个,或者您可以使用自定义队列一次上传五个或更多文件,然后尝试上传其余文件
-
当然让我做点什么。
-
尝试编辑后的答案