【问题标题】:URL generated by Firebase Storage does not allow access to the fileFirebase 存储生成的 URL 不允许访问该文件
【发布时间】:2019-05-08 05:01:18
【问题描述】:

我无法在 Firebase 存储中检索我的图像,当我尝试访问图像的 URL 时,显示以下消息:“X-Goog-Upload-Command 标头,它不是有效的 X-谷歌文件”。我无法通过下载 URL 访问存储在 Storage 中的文件。我寻求帮助,下面的代码是我将文件上传到存储和数据库的方式!

    if (pmcUri != null){

        // show the progress Dialog
        pmcProgress = new ProgressDialog(this);
        pmcProgress.setTitle("Creating your Feed");
        pmcProgress.setMessage("...");
        pmcProgress.show();

        final StorageReference mChildStorage = pmcStorage.child("feedPhotos")
                .child(pmcUri.getLastPathSegment());
        mChildStorage.putFile(pmcUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                final Uri downloadUri = taskSnapshot.getUploadSessionUri();

                FirebaseDatabase database = FirebaseDatabase.getInstance();


                mChildStorage.getDownloadUrl();
                // save infos in Database with user ID as a Reference
                final DatabaseReference myRef = database.getReference("feeds").child(uid.getUid());
                myRef.child("feed").setValue(setName);
                assert downloadUri != null;
                myRef.child("feedimg").setValue(downloadUri.toString());
                myRef.child("feedkey").setValue(uid.getUid());


                pmcProgress.dismiss();

                Intent intent = new Intent(create_feed.this, glime.class);
                startActivity(intent);
            }
        });

    }

【问题讨论】:

  • 为什么说“我无法访问存储在 Storage 中的文件”?你是怎么检查的?
  • 因为我可以上传一个文件(图像)并在存储中看到这个文件,但我无法通过 URL 访问。该网址无效。
  • 代码或浏览器的什么地方?

标签: android firebase url firebase-storage


【解决方案1】:

您阅读 downloadUri 变量的方式是:

final Uri downloadUri = taskSnapshot.getUploadSessionUri();

调用getUploadSessionUri() 会为您提供一个上传 会话的URI,而不是文件上传完成后的下载URL。任务快照中不再提供下载 URL,而是需要对服务器进行额外的异步调用。

当我遇到问题时,我倾向于回退到 Firebase 文档,它有这个方便的example of getting the download URL after an upload has completed

final StorageReference ref = storageRef.child("images/mountains.jpg");
uploadTask = ref.putFile(file);

Task<Uri> urlTask = uploadTask.continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
    @Override
    public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception {
        if (!task.isSuccessful()) {
            throw task.getException();
        }

        // Continue with the task to get the download URL
        return ref.getDownloadUrl();
    }
}).addOnCompleteListener(new OnCompleteListener<Uri>() {
    @Override
    public void onComplete(@NonNull Task<Uri> task) {
        if (task.isSuccessful()) {
            Uri downloadUri = task.getResult();
        } else {
            // Handle failures
            // ...
        }
    }
});

因此,要在上传完成后获取下载 URL,您需要启动一个返回 ref.getDownloadUrl() 的新任务。

另见:

【讨论】:

  • 它正在工作,谢谢..我爱你,我正在学习代码来改善我的生活,我很沮丧,因为我无法解决这个问题,你拯救了我的一年。太感谢了。祝你一切顺利,圣诞快乐。
【解决方案2】:

检查firebase规则,您可以像这样更改以进行测试

service firebase.storage {  match /b/{bucket}/o {
match /{allPaths=**} {
  allow read, write: if true;    }  }}

【讨论】:

  • OP 提到使用下载 URL,这是一个绕过安全规则并提供只读公共访问的 URL。
猜你喜欢
  • 2020-05-24
  • 2017-03-24
  • 2016-10-12
  • 2020-09-26
  • 2017-01-07
  • 2016-12-24
  • 2017-09-28
相关资源
最近更新 更多