我正试图用预先签名的url将一个url文件上传到AWS S3。我得到了预先签署的网址,这似乎是很好的邮递员。随着颤振,它也工作,在某种程度上。
但是,问题是,当通过Flutter上传时(我使用了这个片段),它将上传via文件,但是会将额外的184个字节添加到包含以下内容的标题中:
--dart-http-boundary-z86XWhmTq935Bbfwfv.7UA+FIOU5nE4eqfUsZTh6PnGj+HBeAYH
content-type: application/octet-stream
content-disposition: form-data; name="out.zip"; filename="out.zip"
这个标题导致大多数内置解压缩工具无法解压缩文件。
我能够使用osx的内置unzip
命令解压缩它,但是当通过Safari下载时,我在下载部分得到了‘解压失败’消息。
在Windows上,即使使用7-Zip,我也没有完全解压缩。
是否有一种方法可以删除标题,这样它就可以上传压缩文件,而不需要添加额外的头文件?
免责声明:从核心上说,我不是一个“颤栗”/“达特德夫”。
谢谢!
编辑1:创建签名的URL (遵循AWS ),我使用以下lambda函数:
'use strict'
const AWS = require('aws-sdk');
AWS.config.update({ region: process.env.AWS_REGION });
const s3 = new AWS.S3();
const URL_EXPIRATION_SECONDS = 300;
exports.handler = async function(event, context, callback) {
const body = event.body || {};
return await getUploadURL(JSON.parse(event.body).projectNumber)
}
const getUploadURL = async function(projectNumber) {
let Key = `${projectNumber}.zip`;
if (!projectNumber) {
const randomID = parseInt(Math.random() * 10000000)
Key = `${randomID}.zip`;
}
// Get signed URL from S3
const s3Params = {
Bucket: process.env.UploadBucket,
Key,
Expires: URL_EXPIRATION_SECONDS,
ContentType: 'application/zip',
// This ACL makes the uploaded object publicly readable. You must also uncomment
// the extra permission for the Lambda function in the SAM template.
// ACL: 'public-read'
}
console.log('Params: ', s3Params)
const uploadURL = await s3.getSignedUrlPromise('putObject', s3Params)
return JSON.stringify({
uploadURL: uploadURL,
Key
})
}
发布于 2021-12-22 15:12:32
我对你片段中的这些行表示怀疑(删除它们):
request.headers.addAll({
'Content-Type': mime,
});
我不认为设置整体请求的内容类型是有帮助的--毕竟,这应该保持为“多部分”。如果要将内容类型提供给其中一个部件,则在添加文件的地方(即在代码段的第49行)。请参阅MultipartRequest
的文档。
var request = http.MultipartRequest('POST', uri)
..files.add(await http.MultipartFile.fromPath(
'package', 'build/package.tar.gz',
contentType: MediaType('application', 'x-tar'))); // content type added here
https://stackoverflow.com/questions/70446615
复制相似问题