事前に署名されたURLを使用してファイルをS3バケットに直接アップロードしようとしています。
以下はnode.jsで記述されたサーバーエンドコードであり、署名されたURLを正常に作成します。
const s3 = new AWS.S3({
accessKeyId: config.accessKeyId,
secretAccessKey: config.secretAccessKey,
region: config.awsConfig.region
});
const signedUrlExpireSeconds = 60 * 60;
let mimeType = "video/mp4";
const filename =Date.now();
const Key = `${filename}.mp4`;
const params = {
Bucket: config.awsConfig.aws_upload_bucket,
Key: Key,
Expires: signedUrlExpireSeconds,
ACL: 'public-read',
ContentType: mimeType
};
s3.getSignedUrl('putObject', params, function (err, url) {
if (err) {
console.log('Error getting presigned url from AWS S3');
res.json({ success: false, message: 'Pre-Signed URL error', urls: fileurls });
}
else {
console.log('Presigned URL: ', url);
res.json({ success: true, message: 'AWS SDK S3 Pre-signed urls generated successfully.', url: url, Key:Key, ContentType: mimeType });
}
});
以下はReactの最後に書かれたコードです。
const DropzoneArea = props => {
const [files, setFiles] = useState([]);
let awsFile = '';
const onUploadHandler = files => {
if (files.length === 0) {
console.log('Debug : [components DropzoneArea onUploadHandler] files => ', files);
return;
}
awsFile = files[0]
// calling the API to get presigned url.
getPreSignedURL(files[0].type,S3preSignedURLCallback)
};
const S3preSignedURLCallback = videoData => {
const xhr = new XMLHttpRequest();
xhr.open('PUT', videoData.url);
xhr.setRequestHeader('Content-Type', videoData.ContentType);
var res = new FormData();
res.append('file', awsFile);
xhr.send(res);
};
}
上記のコードを使用すると、ファイルはs3に正常にアップロードされますが、ビデオを再生できませんでした。そこで、S3上のファイルをアップロードした実際のファイルと比較しました。S3ファイルにも追加のリクエストデータがほとんど書き込まれていないことがわかりました。
私がここで行っている小さな間違いは、バグを見つけることができません。助けてください。
使用せずformData
、ファイルを直接送信してください。
const S3preSignedURLCallback = videoData => {
const xhr = new XMLHttpRequest();
xhr.open('PUT', videoData.url);
xhr.setRequestHeader('Content-Type', videoData.ContentType);
// Send the binary data.
// Since a File is a Blob, you can send it directly.
xmlHttpRequest.send(awsFile);
};
表示される違いは、AWSが未加工のリクエストを解析せずに保存しているためです。また、正しい画像がマルチパート/フォームデータリクエストであることがわかります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加