実際のテストケースコードから直接アップロード用のNode.jsとGoogleのクラウドストレージのために署名したURLを作成します。私は私のAPIは、Googleクラウドに直接アップロードするための署名のURLを返送するための機能を追加しようとしているhttps://github.com/HenrikJoreteg/google-cloud-signedurl-test-caseブラウザ
をクライアントからのストレージ。
サーバーサイド、私はこのためにgcloud
SDKを使用しています:
const gcloud = require('gcloud')
const gcs = gcloud.storage({
projectId: 'my project',
keyFilename: __dirname + '/path/to/JSON/file.json'
})
const bucket = gcs.bucket('bucket-name')
bucket.file('IMG_2540.png').getSignedUrl({
action: 'write',
expires: Date.now() + 60000
}, (error, signedUrl) => {
if (error == null) {
console.log(signedUrl)
}
})
は、その後、私は私が使用してファイルを選択した<input type='file'/>
を持っているブラウザで、私はそれを投稿しようとしサーバー側のスクリプトから生成されるURL:
function upload(blobOrFile, url) {
var xhr = new XMLHttpRequest();
xhr.open('PUT', url, true);
xhr.onload = function(e) {
console.log('DONE!')
};
xhr.upload.onprogress = function(e) {
if (e.lengthComputable) {
console.log((e.loaded/e.total) * 100)
}
};
xhr.send(blobOrFile);
}
// grab the `File` object dropped (which incidentally
// matches the file name used when generating the signed URL
upload($('[name=file]').files[0], 'URL GENERATED FROM SERVER-SIDE SCRIPT HERE');
どうしますか?私は、JSONのキーファイルは、それが現在だとそのバケットに適切な権限を持っていることを確認するために再ダウンロードした
<Error>
<Code>SignatureDoesNotMatch</Code>
<Message>The request signature we calculated does not match the signature you provided. Check your Google secret key and signing method.</Message>
<StringToSign>PUT
image/png
1476631908
/bucket-name/IMG_2540.png</StringToSign>
</Error>
と署名を生成するときに、私はすべてのエラーか何かを得ることはありません:
レスポンスですURL。
クライアント側のコードが適切にアップロードを開始しているようです(進捗状況の更新がログアウトされているのがわかります)。上記の403エラーが表示されます。ファイル名が一致し、コンテンツタイプが期待値と一致するように見えます。有効期限は合理的です。
公式のSDKがURLを生成していたので、大丈夫そうです。
私は立ち往生しています。
私はあなたがコンテンツタイプは予想と一致しているように見えると言う知っています。それでも、確認するには、ブラウザから送信されたヘッダーを見るとcontent-type:image/pngですか? XHRはsetRequestHeader()を必要とせずにこれを行いますか? – glenschler
ありがとう@glenschlerですが、XHRはバージョン2のようにこれを行います。ヘッダーは次のとおりです。https://cloudup.com/cWxNOTCs_EZ –
が、孤立したケースのレポを含むように更新されました:https://github.com/HenrikJoreteg/google-cloud-signedurl-test-case –