我正在尝试使用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
处理程序中。