170

Functions for Firebase を使用して Firebase Storage にファイルをアップロードした後、ファイルのダウンロード URL を取得したいと考えています。

私はこれを持っています:

...

return bucket
    .upload(fromFilePath, {destination: toFilePath})
    .then((err, file) => {

        // Get the download url of file

    });

オブジェクト ファイルには多くのパラメータがあります。という名前の 1 つでもmediaLink。ただし、このリンクにアクセスしようとすると、次のエラーが発生します。

匿名ユーザーには、オブジェクトへの storage.objects.get アクセス権がありません ...

パブリック ダウンロード URL を取得する方法を誰か教えてもらえますか?

ありがとうございました

4

24 に答える 24

171

@google-cloud/storage NPM モジュール経由でgetSignedURLを使用して署名付き URL を生成する必要があります。

例:

const gcs = require('@google-cloud/storage')({keyFilename: 'service-account.json'});
// ...
const bucket = gcs.bucket(bucket);
const file = bucket.file(fileName);
return file.getSignedUrl({
  action: 'read',
  expires: '03-09-2491'
}).then(signedUrls => {
  // signedUrls[0] contains the file's public URL
});

アプリケーションのデフォルトの認証情報では不十分なため、サービス アカウントの認証情報@google-cloud/storageで初期化する必要があります。

更新: Cloud Storage SDK は、@google-cloud/storageのラッパーとして機能するFirebase Admin SDK を介してアクセスできるようになりました。唯一の方法は、次のいずれかの場合です。

  1. 特別なサービス アカウントを使用して SDK を初期化します。通常は、デフォルト以外の 2 番目のインスタンスを使用します。
  2. または、サービス アカウントを使用せずに、デフォルトの App Engine サービス アカウントに「signBlob」権限を付与します。
于 2017-03-22T17:53:53.577 に答える
19

私が成功裏に使用している方法の 1 つfirebaseStorageDownloadTokensは、ファイルのアップロードが完了した後に UUID v4 値をファイルのメタデータで指定されたキーに設定し、Firebase がこれらの URL を生成するために使用する構造に従って自分でダウンロード URL を組み立てることです。

https://firebasestorage.googleapis.com/v0/b/[BUCKET_NAME]/o/[FILE_PATH]?alt=media&token=[THE_TOKEN_YOU_CREATED]

この方法を使用することがどれだけ「安全」かはわかりませんが (Firebase が将来ダウンロード URL の生成方法を変更する可能性があることを考えると)、実装は簡単です。

于 2017-04-03T23:15:06.933 に答える
6

事前定義されたアクセス制御リストの値「publicRead」を使用すると、ファイルをアップロードして、非常に単純な URL 構造でアクセスできます。

// Upload to GCS
const opts: UploadOptions = {
  gzip: true,
  destination: dest, // 'someFolder/image.jpg'
  predefinedAcl: 'publicRead',
  public: true
};
return bucket.upload(imagePath, opts);

次に、次のように URL を作成できます。

const storageRoot = 'https://storage.googleapis.com/';
const bucketName = 'myapp.appspot.com/'; // CHANGE TO YOUR BUCKET NAME
const downloadUrl = storageRoot + bucketName + encodeURIComponent(dest);
于 2019-01-25T05:28:27.053 に答える
1

使用するfile.publicUrl()

非同期/待機

const bucket = storage.bucket('bucket-name');
const uploadResponse = await bucket.upload('image-name.jpg');
const downloadUrl = uploadResponse[0].publicUrl();

折り返し電話

const bucket = storage.bucket('bucket-name');
bucket.upload('image-name.jpg', (err, file) => {
  if(!file) {
    throw err;
  }

  const downloadUrl = file.publicUrl();
})

downloadUrlなります"https://storage.googleapis.com/bucket-name/image-name.jpg"

上記のコードを機能させるには、バケットまたはファイルを公開する必要があることに注意してください。これを行うには、https://cloud.google.com/storage/docs/access-control/making-data-publicの指示に従ってください。@google-cloud/storageまた、 Firebase SDK を介さずにパッケージを直接インポートしました。

于 2021-12-31T23:03:05.647 に答える
0

これは管理ストレージのドキュメントで見ました

const options = {
  version: 'v4',
  action: 'read',
  expires: Date.now() + 15 * 60 * 1000, // 15 minutes
};

// Get a v4 signed URL for reading the file
const [url] = await storage
  .bucket(bucketName)
  .file(filename)
  .getSignedUrl(options);

console.log('Generated GET signed URL:');
console.log(url);
console.log('You can use this URL with any user agent, for example:');
console.log(`curl '${url}'`);
于 2020-11-09T14:29:35.973 に答える