0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Firestoreのファイルをブラウザからダウンロードする(React)

Posted at

Cloud Firestoreに保存しているファイルをユーザーが自由にダウンロードできる機能を実装した。公式ドキュメントに手順は記されているのだが、そのままやってもシメのxhr.send()が作動しなくて詰まった。

CORSの設定

まず、大前提としてブラウザから直接ダウンロードするためには、使用しているCloud Storageのバケットに対してクロスオリジン アクセス(CORS)を構成しておく必要がある。

Google Cloud Console上から、エディタを開いて、cors.jsonを作成する。

Overview_–APIs___Services–vidreview-dev–_Google_Cloud_Platform.png

保存が完了したら、ターミナル上で馴染ませる。

$ gsutil cors set cors.json gs://[APP_ID].appspot.com

CLIを使っていれば、クライアント側の開発環境からも実行できる。

ファイルをダウンロードする

Cloud StorageからファイルURLを取得する

storageRef.child('images/stars.jpg').getDownloadURL().then(function(url) {
  ・・・
})

正しく動いていれば、URL部分にhttps://firebasestorage.googleapis.com/v0/b/[APP_ID].appspot.com/o/[FOLDER_NAME]%[TOKEN]?&token=[FILE_TOKEN]のような形式で表示されるはず。

Blobに保存して、aリンクでダウンロード

const xhr = new XMLHttpRequest()
xhr.open("GET", url, true)
xhr.responseType = 'blob'
xhr.onload = () => {
const blob = xhr.response
  var objectURL = window.URL.createObjectURL(blob)
  var link = document.createElement("a")
  document.body.appendChild(link)
  link.href = objectURL
  link.download = 'DOWNLOAD NAME'
  link.click();
  document.body.removeChild(link)
}
xhr.send();

外部リンクに直接aタグを叩いてもファイルをダウンロードすることはできないので、一度Blobに保存する必要がある。そのBlobデータを叩けば、なんなくファイルがダウンロードされる。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?