我可以成功地将图像上传到firebase存储,但当我尝试使用存储引用和getDownloadUrl检索图像时()我只得到不包含token的图像url,没有token我无法显示图像我试着谷歌如何正确检索链接从firebase存储,似乎我做得正确(对于记录IM试图使用该URL将其保存为包含链接的字符串的Firestore字段中的字符串)
例如:我得到这个:
https://firebasestorage.googleapis.com/XX/X/XXXXXXXXXXXXXX/X/XXXXXXXXXXX
而不是这个,当我把从firebase存储手动获取放在firebase控制台上时,它确实起作用
https://firebasestorage.googleapis.com/XX/X/XXXXXXXXXXXXXX/X/XXXXXXXXXXX?alt=media&token=XXXXXXXXXXXXXXXXXXXXXXXXX
这是我如何让用户选择图像
private void openFileChooser()
{
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
activityResultContracts.launch(intent);
}
这就是我如何得到图像uri
ActivityResultLauncher<Intent> activityResultContracts = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult result) {
if(result.getResultCode() == Activity.RESULT_OK)
{
mImageUri = result.getData().getData();
uploadFile();
}
}
});
最后这里是上传文件函数
private void uploadFile()
{
if(mImageUri != null)
{
StorageReference fileReference = storageRef.child("star_images/" + System.currentTimeMillis() + "." + getFileExtension(mImageUri));
fileReference.putFile(mImageUri).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
@Override
public void onComplete(@NonNull Task<UploadTask. TaskSnapshot> task) {
task.getResult().getMetadata().getReference().getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
db.document("stars/" + starId).update("imagePath", uri.toString());
}
});
}
});
}
else
{
Snackbar.make(findViewById(R.id.starProfileLayout),"No file selected.", Snackbar.LENGTH_SHORT).show();
}
}
}
(in我的firestore数据库中的星星有一个名为imagePath的字符串字段
在我的firebase存储中,图像位于名为星星_imageS的文件夹中)
我只是不明白什么是错的。
1条答案
按热度按时间iqjalb3h1#
要获取
downloadUrl
,不需要用途:这是因为你只阅读图像的引用。
task.getResult().getMetadata()
返回类型为StorageMetadata的对象。对这样的对象调用getReference()将返回一个StorageReference类型的对象,该对象返回:此元数据所属的关联StorageReference。
所以看起来你在绕圈子,因为你得到的是对图像本身的引用,而不是包含令牌的
downloadUrl
。要解决这个问题,您只需使用以下代码行: