在回调中在firebase上上传两个文件但无法获取两个文件的getDownloadUrl

Posted

技术标签:

【中文标题】在回调中在firebase上上传两个文件但无法获取两个文件的getDownloadUrl【英文标题】:Uploading two files on firebase in callback but unable to getDownloadUrl of both files 【发布时间】:2020-04-11 09:43:52 【问题描述】:

我正在从 Firebase 存储的数组中上传两个文件,并希望获取这两个文件的 getDownloadUrl,但它只返回第一个元素的 uri。在此代码中,mThumbUri 始终为空。

public class UploadingService extends JobIntentService implements UploadCallBacks 
private static final String CHANNEL_ID = "upload_channel";
private static final int JOB_ID = 1000;
private HashMap<String, String> values;

String mVideoUri = "";
String mThumbUri = "";
private FirebaseUser mUser;
private String postId = null;
//Firebase
StorageReference storageRef = FirebaseStorage.getInstance().getReference();
DatabaseReference mDatabaseReference = FirebaseDatabase.getInstance().getReference();


public static void enqueueWork(Context context, Intent intent) 
    enqueueWork(context, UploadingService.class, JOB_ID, intent);


@Override
public void onCreate() 
    super.onCreate();
    createNotificationChannel();
    mUser = FirebaseAuth.getInstance().getCurrentUser();


@Override
protected void onHandleWork(@NonNull Intent intent) 
    if (intent.hasExtra(AppConstants.DATA)) 
        values = (HashMap<String, String>) intent.getSerializableExtra(AppConstants.DATA);
        hitVideoUploadApi();
    


/**
 * method for video upload
 */
private void hitVideoUploadApi() 
    postId = UUID.randomUUID().toString();
    ArrayList<Uri> files = new ArrayList<>();
    Uri VideoUri = Uri.fromFile(new File(values.get(AppConstants.VIDEO_PATH)));
    Uri ThumbUri = Uri.fromFile(new File(values.get(AppConstants.THUMB_PATH)));

    files.add(VideoUri);
    files.add(ThumbUri);

    Notification notification = builder.build();
    startForeground(NOTIFICATION_ID, notification);

使用循环我将两个文件上传到 firebase 存储并获取字符串 mVideoUrlmThumbUrl 中的 url 以将这些字符串上传到 firebaseDatabase:

final int[] i = 0;
    for (Uri uri : files) 

        storageRef.child("PostData/" + UUID.randomUUID().toString()).putFile(uri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() 
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) 
             Task<Uri> uri = taskSnapshot.getStorage().getDownloadUrl().addOnCompleteListener(new OnCompleteListener<Uri>() 
                    @Override
                    public void onComplete(@NonNull Task<Uri> task) 

                        Uri uri = task.getResult();
                        i[0]++;
                        if (i[0] == 1) 
                            mVideoUri = uri.toString();

                         else 
                            mThumbUri = uri.toString();
                        
                    
                );
            

在 addOnCompleteListener 中调用将这些 url 上传到 firebase 实时数据库的乐趣

        ).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() 
            @Override
            public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) 
                hitUploadPostApi(mVideoUri, mThumbUri, postId);
            
        ).addOnFailureListener(new OnFailureListener() 
            @Override
            public void onFailure(@NonNull Exception e) 
                notificationManager.cancel(NOTIFICATION_ID);
                Toast.makeText(getApplicationContext(), "Error while Uploading", Toast.LENGTH_SHORT).show();
            
        );
    

【问题讨论】:

你确定任务成功了吗?您应该在 onComplete 回调中添加条件 if (task.isSuccessfull()) 以确保您不会继续出错。 你说mThumbUri在哪个地方是空的?在onComplete 方法内部? 是的,它的任务正在成功运行并上传两个文件,但只是获取第一个文件的 getDownloadUrl,即 mVideoUrl @Christilyn Uri uri = task.getResult(); i[0]++; if (i[0] == 1) mVideoUri = uri.toString(); else mThumbUri = uri.toString(); here in else uri.tostring 是空的,我存储在 mThumbUri @AlexMamo This 是您获取下载网址的方式。 【参考方案1】:

上传完成后,您可以检查 Firebase 存储以获取文件的所有 URL,因为您知道文件的名称。 我在 1 年前写了这篇文章,然后它就奏效了。

在 [child()] 方法中,您必须输入文件名。 另外,请记住 firebase 是异步的。

现在来看你的代码,我认为导致问题的原因是

最初 我[0]=0; 1个文件上传成功 我[0]=1, 2 文件上传成功 i[0]=2。

但是你正在检查 [if(i[0]==1)] 而第二次'i'是两个

【讨论】:

if (i[0] == 1) 在 i++ 和第二个文件我使用 else .... 时有效,所以如果 i 为 0 或 2,它应该有效 嗨罗汉。请用文本等价物替换您的图像 - 如果有人希望您的代码,他们不会想从图像中转录它。谢谢!

以上是关于在回调中在firebase上上传两个文件但无法获取两个文件的getDownloadUrl的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Firebase 上上传 proguard 映射文件

Firebase Storage Web:如何上传文件

Angular 6 - 上传后获取 Firebase 存储文件的下载 URL

如何在 firebase 存储上上传多个文件并将访问 url 和元数据作为 json 或 csv 文件获取? [关闭]

反应原生无法将图像上传到firebase

为啥无法使用 Google Firebase 存储中的下载 URL 打开上传的文件?