上传图片时出现Android FireBase错误

时间:2016-07-14 18:18:40

标签: android firebase firebase-storage

我正在尝试通过本地文件方法上传图片。

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()从本地文件上传时,它上传了元数据,但没有上传照片。

任何想法如何解决?

2 个答案:

答案 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]