POST interface経由でAWS S3にファイルをアップロードしたいのですが、失敗します。POSTでファイルをs3にアップロード
私はすでにPUTとgetSignedUrl
で動作させていますが、残念ながらそのインターフェイスではファイルサイズの直接制限はできません。だから私は'content-length-range'
の条件を使用できるので、私はPOSTインターフェイスを使用しようとしました。
はここに私の要求の署名です:
const aws = require('aws-sdk');
aws.config.update({
signatureVersion: 'v4',
region: 'eu-central-1',
accessKeyId: config.aws.keyId,
secretAccessKey: config.aws.keySecret
});
const s3 = new aws.S3();
return new Promise((resolve, reject) => {
const params = {
Bucket: config.aws.bucket,
Fields: {
key: filePath
},
Expires: config.aws.expire,
Conditions: [
['acl', 'public-read'],
['content-length-range', 0, 10000000] // 10 Mb
]
};
const postUrl = s3.createPresignedPost(params, (err, data) => {
resolve(data);
});
});
この部分はOKのようですが、私はS3にファイルをアップロードするために必要な署名を使用することはできません。
request.post({
url: payload.url,
body: payload,
form: fs.createReadStream(__dirname + `/${filePath}`)
}, (err, response, body) => {});
別の試み:フェッチして
let formData = payload;
formData.file = fs.createReadStream(__dirname + `/${filePath}`);
request.post({
url: payload.url,
formData: formData
}, (err, response, body) => {});
:ここ
は私が作ったいくつかの他の試みです
const fetch = require('node-fetch');
const FormData = require('form-data');
const form = new FormData();
const fields = payload.fields;
for(const field in payload.fields) {
form.append(field, payload.fields[field]);
}
form.append('file', fs.createReadStream(__dirname + `/${filePath}`));
fetch(payload.url, {
method: 'POST',
body: form.toString(),
headers: form.getHeaders()
})
.then((response) => {})
.catch((err) => {});
これらの作業のどちらも、彼らが悪い」と言うのいずれかリクエスト、または 'Badly Formed Request'と表示されます。そのうちの1人がサーバーに何かをアップロードしましたが、ファイルは読めませんでした。
S3バケットに最大ファイルサイズ制限を追加するにはどうすればよいですか?
更新: 少し前に進んでいると思います。このコードでは、エラー応答が返されます。You must provide the Content-Length HTTP header.
const fetch = require('node-fetch');
const FormData = require('form-data');
const form = new FormData();
form.append('acl', 'public-read');
for(const field in payload.fields) {
form.append(field, payload.fields[field]);
}
form.append('file', fs.createReadStream(__dirname + `/${filePath}`));
fetch(payload.url, {
method: 'POST',
body: form,
headers: form.getHeaders()
})
.then((response) => { return response.text(); })
.then((payload) => { console.log(payload); })
.catch((err) => console.log(`Error: ${err}`));
S3 SDKは、サーバーがファイルを処理するために必要な余分なメタデータを送信すると考えています。 Fiddlerなどのプロキシを使用して、SDKから送信された要求を検査し、複製を開始することができます。 SDKリクエストと 'request.post'リクエストを比較し、その差を見つけて補正します。 これを行うことでさらに助けてもらえますが、JavaScriptの観点からはS3に精通していないので、.NET経由でしか使用していません。 最大バケットサイズについては、AWSのドキュメントを参照してください。 –