在回调中在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 存储并获取字符串 mVideoUrl 和 mThumbUrl 中的 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 映射文件
Angular 6 - 上传后获取 Firebase 存储文件的下载 URL