【问题标题】:Upload Multiple Images in a Firebase在 Firebase 中上传多个图像
【发布时间】:2019-06-13 12:36:12
【问题描述】:

我正在尝试使用 for 循环上传多张图片。我已将我所有的 fileuri 都放在一个列表中,在完成任务时,只有最后一张图片被上传了几次。

如果我要上传五张图片,那么最后一张图片会上传五次。

我还尝试将所有任务添加到列表中并循环播放。但仍然只有最后一张图片正在上传。

foreach(imgurl){

final StorageReference storageReference = mStorageReference.child("/photos" + "/photo" + (count + 1));

UploadTask uploadTask = storageReference.putFile(imgUrl);

Task<Uri> urlTask = uploadTask.continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
                        @Override
                        public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception {
                            if (!task.isSuccessful()) {
                                throw task.getException();
                            }
                            return storageReference.getDownloadUrl();
                        }
                    }).addOnCompleteListener(new OnCompleteListener<Uri>() {
                        @Override
                        public void onComplete(@NonNull Task<Uri> task) {
                            if (task.isSuccessful()) {
                                Uri downloadUri = task.getResult();
                                addPhoto(downloadUri.toString());

                            } else {
                                Log.d(TAG, "onFailure: Photo upload failed.");
                                Toast.makeText(mContext, "Photo upload failed ", Toast.LENGTH_SHORT).show();
                            }
                        }
                    });

}

}

【问题讨论】:

标签: android firebase firebase-storage


【解决方案1】:

如果您有 5 张图片,那 5 张图片应该包含不同的 imgUrl,您将使用相同的 uploadTask 迭代 N 次上传代码到 Firebase 存储

UploadTask uploadTask = storageReference.putFile(imgUrl); --> This same task

tasks.add(uploadTask);

for (UploadTask str : tasks) { --> is repeating N times with the same imgUrl

Task<Uri> urlTask = str.continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
                        @Override
                        public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception {
                            ...

例如,您应该做的是移动您的 forEach 循环以处理每个不同的 imgUrl,然后将每个循环上传到您的存储中

伪代码

forEach(imgUrl) {
   uploadtask = storageReference.putFile(imgUrl);
   tasks.add(uploadTask);

   Task<Uri> urlTask = str.continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
                        @Override
                        public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception {
                            ...

【讨论】:

  • 我也试过了,但是当它到达 Task 时,它会迭代到下一个 imageurl,然后在最后一次迭代中,它会多次上传最后一个 imageurl。
【解决方案2】:

你可以试试这个,它对我有用!

private void uploadImages() {
    findViewById(R.id.add).setEnabled(false);
    findViewById(R.id.add).setBackgroundResource(R.drawable.border_buttons_disable);
    builder = new AlertDialog.Builder(context);
    builder.setTitle("Adding " + type);
    builder.setMessage("We are validating data...");
    alertDialog = builder.create();
    alertDialog.setCancelable(false);
    alertDialog.setCanceledOnTouchOutside(false);
    alertDialog.show();
    for (int i = 0; i < urls.size(); i++) {
        UploadTask uploadTask = (UploadTask) storageReference.child("images/businesses/products/" + preferencesAdapter.getId() + "-" + _sku + "-" + i + ".png").putFile(Uri.parse(urls.get(i))).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                taskSnapshot.getStorage().getDownloadUrl().addOnCompleteListener(new OnCompleteListener<Uri>() {
                    @Override
                    public void onComplete(@NonNull Task<Uri> task) {
                        selectedPictures.add(task.getResult().toString().substring(0, task.getResult().toString().indexOf("&token")));
                        if (selectedPictures.size() == urls.size()) {
                            alertDialog.dismiss();
                            addProduct();
                        }
                    }
                });
            }
        });
    }
}

只需创建这些数组: ArrayList&lt;String&gt; urls;

对于每个图像,用户从意图中选择添加到“urls”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 2021-05-12
    • 2021-04-14
    • 2018-07-03
    • 1970-01-01
    相关资源
    最近更新 更多