【问题标题】:Firebase SignedURL not equal to download url StorageFirebase SignedURL 不等于下载 url 存储
【发布时间】:2017-09-23 01:58:56
【问题描述】:

我之前问过一个问题,从 Firebase Storage 获取 downloadURL,给我的答案是:

bucket.file(filename).getSignedUrl({
  action: 'read',
  expires: '03-17-2025'
}, function(err, url) {
  if (err) {
    console.error(err);
    return;
  }

  // The file is now available to read from this URL.
  request(url, function(err, resp) {
    // resp.statusCode = 200
  });
});

当我使用 Glide 下载图像或使用 ExoPlayer 重新生成音频或视频文件时,前面的代码给出的那个不起作用。

但是,当上传文件时,我得到的 URL 与 Firebase 存储提供的 URL 完全不同(这对 Glide 和 ExoPlayer 有效),如下所示:

https://firebasestorage.googleapis.com/v0/b/project-PROYECT_NUMBER.appspot.com/o/Messages%2Fimages%2F-KUj4wvXXl6aj9XXXX%2F1493147111111?alt=media&token=TOKEN

如何在服务器端获得正确的 downloadUrl,就像使用 Android 或 iOS SDK 获得的一样?

【问题讨论】:

    标签: android url firebase download firebase-storage


    【解决方案1】:

    无法像使用 Android、iOS 或 Javascript SDK 那样在服务器端获取下载 url。您必须通过调用 getSignedUrl() 来生成一个 url。

    您可能需要检查您是否有权读取给定 URL 处的文件。

    默认情况下,您必须经过身份验证。

    在 Firebase 控制台中检查您的存储规则

    https://firebase.google.com/docs/storage/security/#authorization

    【讨论】:

      【解决方案2】:

      我希望您只通过应用程序上传图片不好吗?上传后,您将获得下载链接。我希望这能帮助你。

      import com.google.firebase.storage.StorageTask;
      
       final StorageTask uploadTask = uplodedFileRef.putBytes(data);
          Log.d(TAG, "uploadFilefromPath: " + uplodedFileRef.getPath().toString());
      uploadTask.addOnFailureListener(new OnFailureListener() {
                      @Override
                      public void onFailure(@NonNull Exception exception) {
                          // Handle unsuccessful uploads
                          Toast.makeText(acty, "Upload Failed", Toast.LENGTH_SHORT).show();
                          dialog.dismiss();
                          sendResult(false, Uri.EMPTY);
                      }
                  })
                  .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                      @Override
                      public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                          // taskSnapshot.getMetadata() contains file metadata such as size, content-type, and download URL.
                          Toast.makeText(acty, "Upload Successful", Toast.LENGTH_SHORT).show();
                          dialog.dismiss();
                          sendResult(true, taskSnapshot.getDownloadUrl());
                      }
                  })
                  .addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
                      @Override
                      public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
      
                          int bytesTransferred = (int) taskSnapshot.getBytesTransferred();
                          int totalBytes = (int) taskSnapshot.getTotalByteCount();
                          int progress = (100 * bytesTransferred) / totalBytes;
      
                          Log.v(TAG, "Bytes transferred: " + taskSnapshot.getBytesTransferred());
                          Log.v(TAG, "TotalBytes: " + totalBytes);
                          Log.v(TAG, "Upload is: " + progress + "% done");
      
                          dialog.setContent("Upload in Progress");
                          dialog.getProgressBar().setIndeterminate(false);
                          // double progress = (100.0 * taskSnapshot.getBytesTransferred()) / taskSnapshot.getTotalByteCount();
                          dialog.getProgressBar().setMax(totalBytes / 1024);
                          dialog.setMaxProgress(totalBytes / 1024);
                          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                              dialog.getProgressBar().setProgress(bytesTransferred / 1024, true);
                              dialog.setProgress(bytesTransferred / 1024);
                          } else
                              dialog.getProgressBar().setProgress(bytesTransferred / 1024);
                          dialog.setProgress(bytesTransferred / 1024);
                          // dialog.getProgressBar().setProgress((int) progress);
                      }
                  });
      

      【讨论】:

      • 问题是我正在做我想通过服务器检索该 URL
      • 看到我已经添加了答案查看它@Andrea
      • 对不起,答案与我的要求不符,我需要在 Firebase Functions 节点代码中检索该 URL
      • 首先你应该在问题中明确提及na?
      【解决方案3】:
      addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { //success
                  sendResult(true, taskSnapshot.getDownloadUrl());
            }
      })
      

      在这个taskSnapshot.getDownloadUrl() 中,您将收到下载 url,然后将其保存在 firebase 数据库中,您可以在何时检索

      【讨论】:

      • 对不起,答案与我的要求不符,我需要在 Firebase Functions 节点代码中检索该 URL
      • 使用上述方法,您应该将下载 URL 存储在一个节点中,然后从您的 Firebase 函数访问该节点。
      猜你喜欢
      • 2018-08-09
      • 2021-04-07
      • 2017-06-07
      • 2021-10-23
      • 2019-09-29
      • 1970-01-01
      • 2018-01-09
      • 2020-07-30
      • 2019-11-15
      相关资源
      最近更新 更多