【发布时间】:2020-11-06 10:12:21
【问题描述】:
基本上我愿意通过浏览器将文件直接上传到 S3,即没有任何网络服务器充当这样的中间件或代理。
所以我使用 boto3 库生成预签名 URL,如下所示:
def put_url(self, key):
url = self.client.generate_presigned_url(
ClientMethod="put_object",
Params={
"Bucket": "visweswaran",
"Key": key
}
)
return url
这会返回一个完全没问题的预签名 URL。我正在使用 JQuery 向 S3 发出 ajax PUT 请求以上传我的文件。
let file_data = document.getElementById("file_data").files[0];
var form = new FormData();
form.append("", file_data, "test.txt");
var settings = {
"url": url,
"method": "PUT",
"timeout": 0,
"processData": false,
"mimeType": "multipart/form-data",
"contentType": "text/plain",
"beforeSend": function(xhr){xhr.setRequestHeader('Content-Disposition', 'attachment');},
"data": form
};
$.ajax(settings).done(function (response) {
location.reload();
});
文件通过浏览器成功上传到 S3。但是当我打开文件时,我看到奇怪的元数据像这样被添加到文件的顶部,
-----------------33057860671031084693134041830 内容处置:表单数据;名称=“名称”
test.txt -----------------------------33057860671031084693134041830 内容处置:表单数据;名称=“文件”;文件名="test.txt" 内容类型:text/plain
我也尝试过更正式的解决方案,例如 Pluploader (https://www.plupload.com/),我也面临同样的问题。我希望有人指出我正确的方向来解决它。非常感谢 Ant 的帮助。
参考资料:
- https://softwareontheroad.com/aws-s3-secure-direct-upload/
- How to upload to AWS S3 directly from browser using a pre-signed URL instead of credentials?
工作解决方案
我已经用视频进行了测试,您不需要表格。直接发送数据就行了
let video = document.getElementById("video_file").files[0];
var settings = {
"url": url,
"method": "PUT",
"timeout": 0,
"processData": false,
"data": video
};
$.ajax(settings).done(function (response) {
location.reload();
});
【问题讨论】:
-
我建议使用 POST 而不是 PUT 从浏览器上传文件。您可以改用
generate_presigned_post来为前端表单生成所需的字段值。这是一个很棒的tutorial,告诉你如何一步一步来。 -
您可以尝试在不使用 formData 的情况下发送 PUT 请求吗?
data属性将具有file_data的引用,并且签名和发送(ajax)时的内容类型可以是ContentType: 'binary/octet-stream'。 -
如果删除
"mimeType": "multipart/form-data",和xhr.setRequestHeader('Content-Disposition', 'attachment');会发生什么? -
@FelixKling 我已经删除了 mimeType 并且我看到了同样的东西 ---------------------------- -261461442633876784451364777288 内容处置:表单数据;名称=""; filename="test.txt" 内容类型:文本/纯文本
标签: javascript jquery python-3.x amazon-s3 boto3