将多个文件的url上传到Firestore-Android时出现问题



我正在尝试使用for循环将多个文件上传到firebase存储,并将它们的url上传到Firestore。如果我尝试上传3个文件,那么所有3个文件都会上传到firebase存储,但只有第一个文件的url会添加到Firestore。我在for循环中没有看到任何问题,那么我应该如何解决这个问题呢?

 @Override
 protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
     super.onActivityResult(requestCode, resultCode, data);
     if (requestCode == 101 && resultCode == RESULT_OK) {
         final String folderName = intent.getStringExtra("folderName");
         if (data.getClipData() != null) {
             //multiple files
             int numItemSelected = data.getClipData().getItemCount();
             for (int i = 0; i < numItemSelected; i++) {
                 Uri pdfUri = data.getClipData().getItemAt(i).getUri();
                 fileName = getFileName(pdfUri);
                 pdfNameList.add(fileName);
                 pdfUrlList.add(pdfUri.toString());
                 StorageReference pdfRef = storageReference.child(folderName + "/" + fileName);
                 pdfRef.putFile(pdfUri)
                     .addOnSuccessListener(new OnSuccessListener < UploadTask.TaskSnapshot > () {
                         @Override
                         public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                             Toast.makeText(MainActivity.this, "File Uploaded!", Toast.LENGTH_SHORT).show();
                             Task < Uri > uriTask = taskSnapshot.getStorage().getDownloadUrl();
                             while (!uriTask.isComplete());
                             Uri uri = uriTask.getResult();
                             Map < String, Object > map = new HashMap < > ();
                             map.put("url", String.valueOf(uri));
                             map.put("name", fileName);
                             DocumentReference documentReference =
                                 db.collection(folderName).document(fileName);
                             documentReference.set(map)
                                 .addOnSuccessListener(new OnSuccessListener < Void > () {
                                     @Override
                                     public void onSuccess(Void aVoid) {
                                         Log.d("TEST", "onSuccess: Task was  successful");
                                     }
                                 })
                                 .addOnFailureListener(new OnFailureListener() {
                                     @Override
                                     public void onFailure(@NonNull Exception e) {
                                         Log.d("TEST", "onFailure: Task was not successful" +
                                             e.getLocalizedMessage() + "  " + e.getMessage());
                                     }
                                 });
                         }
                     })
                     .addOnFailureListener(new OnFailureListener() {
                         @Override
                         public void onFailure(@NonNull Exception e) {
                             Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
                         }
                     });

             }
             Log.d("size", "onActivityResult: " + pdfNameList.size()); //logs the correct size
         } else if (data.getData() != null) {
             //selected single file
             //working code,skipped from here   
         }
     }
 }

编辑:只有最后一个文档被上传到Firestore。如果我正在上传两个文件,那么I(循环的变量(的值在将字符串放入我的映射后为2

编辑:我的问题与此类似,但我似乎无法理解的解决方案

问题是您在循环中以同步方式执行多个顺序异步操作(上传到存储并将数据添加到firestore(,这会导致以下行为(示例(:

第二次上传到Storage会在第一次上传到Firestore的操作完成之前触发,这会导致用下一次上传的值填充用于Firestore操作的fileName变量。

为了解决您面临的问题,我的建议是要么不按顺序执行操作,例如将所有内容上传到存储中,然后再将所有内容添加到firestore,要么在填充filename变量的值之后立即填充映射中依赖于该变量的部分,而不在onSuccess处理程序中。

最新更新