Google Cloud StorageのSigned URLでアップするときのCORS設定


主に自分用ですが、たぶん1年後忘れてそうなのでメモすることにしました

GCSでSignedUrlを発行してクライアント側でアップしたい

よくあるケースですよね。とりあえずSignedUrlを発行するところは、以下のドキュメントを見て簡単にできました。

そうして出来上がったURLをDropzone.jsに食わせてアップロードしようと思ったのですが、CORSエラーに引っかかりました。
こちらの記事なども参考にしたのですが、そのままではアップロードできませんでした。

最終的に成功したCORS設定

[
    {
      "origin": ["https://example.com"],
      "responseHeader": ["content-type", "cache-control","x-requested-with"],
      "method": ["PUT"],
      "maxAgeSeconds": 3600
    }
]

今回クライアントサイドからはPUTしかしないので、GETなどは入れていませんがお好みで追加してください。当初Content-typeのみをresponseHeaderにセットしていたのですが、それだとだめでした。

Preflightリクエストのリクエストヘッダを見てみると、以下のheaderを要求していたので、追加しました。

それだけだとダメだった

それだけだとなぜかCORSエラーが出て頭を抱えていたのですが、githubのissueなどを参考に、明示的にContent-typeをセットするといけたとありました。

# Dropzoneのoptionに追加
そのほかのオプション,
sending: function(file, xhr) {
  var _send = xhr.send;
  xhr.setRequestHeader("Content-type","application/octet-stream");
  xhr.send = function() { // そもそもGCSにアップするときのハック
    send.call(xhr, file);
  }
}, 

どうも、CORSエラーじゃないエラーでもCORSのエラーとしてブラウザに出てきてしまうみたいです。