ブラウザーから直接、プライベート s3 バケットにアップロードすることに関する Heroku の記事を見つけました。
https://devcenter.heroku.com/articles/s3-upload-node
私にとって、aws-sdk パッケージは役に立ったというより邪魔になりました。疑わしい s3upload スクリプトは、もう 1 つの懸念事項でした。
面倒なことをせずにs3に直接アップロードするにはどうすればよいですか?
ブラウザーから直接、プライベート s3 バケットにアップロードすることに関する Heroku の記事を見つけました。
https://devcenter.heroku.com/articles/s3-upload-node
私にとって、aws-sdk パッケージは役に立ったというより邪魔になりました。疑わしい s3upload スクリプトは、もう 1 つの懸念事項でした。
面倒なことをせずにs3に直接アップロードするにはどうすればよいですか?
これを理解するために、古い Java ベースのプロジェクトを掘り下げる必要がありました。本質に取り掛かると、それは素晴らしくシンプルであることがわかります. まず、アップロードを行うための簡単な HTML フォームをセットアップします。
<form action="https://BUCKETNAME.s3.amazonaws.com/"
method="post"
enctype="multipart/form-data">
<input type="hidden" name="key" value="KEY"></input>
<input type="hidden" name="AWSAccessKeyId" value="ACCESS_KEY"></input>
<input type="hidden" name="policy" value="POLICY"></input>
<input type="hidden" name="signature" value="SIGNATURE"></input>
<input type='file' name='file'>
<input type='submit' value='Upload Driver Photo'>
</form>
次に、簡単な Node.JS スクリプトを作成して、上記の値、POLICY
および以下の変数の値を生成します。どちらの値も base64 でエンコードする必要があることに注意してください。SIGNATURE
encodedPolicy
signature
var crypto=require("crypto"),
bucketName="BUCKETNAME",
secretKey="SECRET_KEY",
s3Key="KEY",
expiration= new Date();
expiration.setDate(expiration.getDate()+1);
var policy={
expiration:expiration.toISOString(),
conditions:[
{bucket:bucketName},
{key:s3Key}
]
},
encodedPolicy=new Buffer(JSON.stringify(policy)).toString("base64"),
signature=crypto.createHmac(
"sha1", secretKey
).update(encodedPolicy).digest("base64");
上記の Node.JS コードを Promise でラップすると、さらに美味しくなります。Angular/REST、テンプレートを使用した Express、または選択したその他のミドルウェア/プレゼンテーション フレームワークに埋め込みます。
注: 上記のコードは、アップロード ファイルのサイズを制限しません。これは別の条件、つまり 50MB の制限で行われます["content-length-range", 0, 52428800]
。
例に示すように、minio-jsを使用してこれを行うことができます
サーバーで、次のような PUT の署名付き URL を取得します。
var presignedUrl = s3Client.presignedPutObject('my-bucketname', 'my-objectname', 1000, function(e, presignedUrl) {
if (e) return console.log(e)
console.log(presignedUrl)
})
ブラウザでこれpresignedUrl
を使用して、S3 への単純な PUT リクエストを作成し、オブジェクトをアップロードします。