使用预签名 URL 将图像上传到 S3
Upload image to S3 using presigned URL
让一个简单的测试工作让我感到很痛苦。我正在使用 React Native 开发移动应用程序。我想生成一个预先签名的 URL 并使用它 url 将视频文件上传到 s3。我目前只是尝试通过以下方式测试这种方法:
const file = fs.readFileSync('./video.mp4')
s3.getSignedUrl('putObject', {Bucket: 'mybucket', Key: 'video.mp4'}, (err, url) => {
if (err) { console.log(err); }
else {
fetch(url, {
method: 'PUT',
body: file
})
.then(success => console.log(success.status))
.catch(e => console.log(e))
})
})
我得到一个 200 状态代码,但是出现在 S3 上的 'file' 有 0 个字节。当我尝试上传通过 fs.readFileSync 收到的任何文件时,我注意到同样的事情发生了。
我设法临时解决了这个问题 fs.readFileSync('./video.mp4', 'base64'),但这在我的应用程序中不起作用,因为我需要访问原始视频格式,而不是 base64 字符串。我也成功地使用了 s3.upload,但这在我的应用程序中也不起作用,因为我想在我授予他们与 s3 进行交互的权限之前验证我的所有用户在我的服务器上的操作。
我真的很感激一些建议。我整天都在摆弄 ContentTypes 和 ContentLengths。
您需要使用 FormData
以参数 file
包装您的文件,如下所示:
var body = new FormData();
body.append('file', file);
fetch(url, { method: 'PUT', body: body });
让一个简单的测试工作让我感到很痛苦。我正在使用 React Native 开发移动应用程序。我想生成一个预先签名的 URL 并使用它 url 将视频文件上传到 s3。我目前只是尝试通过以下方式测试这种方法:
const file = fs.readFileSync('./video.mp4')
s3.getSignedUrl('putObject', {Bucket: 'mybucket', Key: 'video.mp4'}, (err, url) => {
if (err) { console.log(err); }
else {
fetch(url, {
method: 'PUT',
body: file
})
.then(success => console.log(success.status))
.catch(e => console.log(e))
})
})
我得到一个 200 状态代码,但是出现在 S3 上的 'file' 有 0 个字节。当我尝试上传通过 fs.readFileSync 收到的任何文件时,我注意到同样的事情发生了。 我设法临时解决了这个问题 fs.readFileSync('./video.mp4', 'base64'),但这在我的应用程序中不起作用,因为我需要访问原始视频格式,而不是 base64 字符串。我也成功地使用了 s3.upload,但这在我的应用程序中也不起作用,因为我想在我授予他们与 s3 进行交互的权限之前验证我的所有用户在我的服务器上的操作。 我真的很感激一些建议。我整天都在摆弄 ContentTypes 和 ContentLengths。
您需要使用 FormData
以参数 file
包装您的文件,如下所示:
var body = new FormData();
body.append('file', file);
fetch(url, { method: 'PUT', body: body });