我正在尝试通过本地文件方法上传图片。
UploadTask uploadTask = currentPicRef.putFile(file, metadata);
当用户从图库中选择图像或通过相机拍照时,图片将保存在外部存储器中,我将uri保存为共享首选项。
我使用setImageURI(uri)
方法成功将图像加载到imageview中,但是当我调用firebase方法并使用相同的uri(Uri file = Uri.fromFile(new File(fileName));
)时
我收到了错误
找不到要上传的文件:file:/// content%3A / media / external / images / media / 22943
但是当我使用log来检查我得到的本地文件时
uri是内容:// media / external / images / media / 22943
另外值得一提的是,当我在firebase中使用uri.parse()
代替uri.fromFile()
从本地文件上传时,它上传了元数据,但没有上传照片。
任何想法如何解决?
答案 0 :(得分:2)
无论如何,也许有点晚了:
找不到要上传的文件:file:/// content%3A / media / external / images / media / 22943
我认为您可能遇到网址编码问题(请参阅文件uri中的%3A )。
尝试解码uri Uri file = Uri.fromFile(new File(fileName));
,然后再将其传递给Firebase存储参考。
如果它不起作用,而是以这种方式Uri.fromFile(new File(fileName))
检索图像uri,您可以尝试在共享首选项中保存本地图像路径(我假设当您从图库中获取图像或相机,您也可以使用本地路径),并使用此功能将图像上传到存储Firebase。
答案 1 :(得分:0)
fileName
可以确定fileUri.toString()
。这对我有用:
Uri uploadUri = Uri.fromFile(new File(fileUri.toString()));
这是一个有效的例子:
// [START upload_from_uri]
private void uploadFromUri(Uri fileUri) {
Uri uploadUri = Uri.fromFile(new File(fileUri.toString()));
Log.d(TAG, "uploadFromUri:src:" + fileUri.toString());
// [START get_child_ref]
// Get a reference to store file at photos/<FILENAME>.jpg
final StorageReference photoRef = mStorageRef.child("photos").child(uploadUri.getLastPathSegment());
// [END get_child_ref]
// Upload file to Firebase Storage
// [START_EXCLUDE]
showProgressDialog();
// [END_EXCLUDE]
Log.d(TAG, "uploadFromUri:dst:" + photoRef.getPath());
photoRef.putFile(uploadUri)
.addOnSuccessListener(this, new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
// Upload succeeded
Log.d(TAG, "uploadFromUri:onSuccess");
// Get the public download URL
mDownloadUrl = taskSnapshot.getMetadata().getDownloadUrl();
// [START_EXCLUDE]
hideProgressDialog();
updateUI(mAuth.getCurrentUser());
// [END_EXCLUDE]
}
})
.addOnFailureListener(this, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
// Upload failed
Log.w(TAG, "uploadFromUri:onFailure", exception);
mDownloadUrl = null;
// [START_EXCLUDE]
hideProgressDialog();
Toast.makeText(MainActivity.this, "Error: upload failed",
Toast.LENGTH_SHORT).show();
updateUI(mAuth.getCurrentUser());
// [END_EXCLUDE]
}
});
}
// [END upload_from_uri]