防止Javascript在文件上载到S3时添加元数据
基本上,我愿意通过浏览器将文件直接上传到S3,也就是说,没有任何web服务器充当这样的中间件或代理 因此,我使用boto3库生成预签名URL,如下所示:防止Javascript在文件上载到S3时添加元数据,javascript,jquery,python-3.x,amazon-s3,boto3,Javascript,Jquery,Python 3.x,Amazon S3,Boto3,基本上,我愿意通过浏览器将文件直接上传到S3,也就是说,没有任何web服务器充当这样的中间件或代理 因此,我使用boto3库生成预签名URL,如下所示: def put_url(self, key): url = self.client.generate_presigned_url( ClientMethod="put_object", Params={ "Bucket": "vi
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。但是当我打开文件时,我看到奇怪的元数据像这样被添加到文件的顶部
-----------------------------3305760671031084693134041830内容处理:表单数据;name=“name”
test.txt
-----------------------------3305760671031084693134041830内容处理:表单数据;name=“file”;filename=“test.txt”
内容类型:文本/纯文本
我还尝试了一个更正式的解决方案,比如Pluploader(),我面临着同样的问题。我想有人给我指出正确的方向来解决它。非常感谢蚂蚁的帮助
参考文献:
工作解决方案
我已经测试了一个视频,你不需要表格。直接发送数据就行了
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();
});
我尝试过使用两种方法上载带有预签名put url的
txt
文件:
- 这实际上将
头添加到问题中提到的最终文件中内容处置
- 文件已正确上载,并且未包含
标题内容处置
formData
的情况下发送PUT
请求
ajax的data
属性的值应为file\u data
,并且在签署s3url和发送(ajax)时的内容类型应为ContentType:'binary/octet stream'
如果您需要使用formData,请查看S3的preSignedPost。我建议使用POST而不是PUT从浏览器上载文件。您可以使用generate_presigned_post
生成前端表单字段的所需值。下面是一个关于如何一步一步完成的好例子。您能尝试在根本不使用formData的情况下发送PUT请求吗?data
属性将引用file\u data
,签名和发送(ajax)时的内容类型可以是ContentType:“二进制/八位字节流”
。如果删除“mimeType”:“多部分/表单数据”
和xhr.setRequestHeader('content-Disposition','attachment')代码>?@FelixKling我已经删除了mimeType,我看到了同样的事情-------------------2614614426338767844513647288内容处置:表单数据;name=“”;filename=“test.txt”内容类型:text/plainI quiet不明白您的答案,我已更改了内容类型,但数据属性是文件内容所在的位置,还是我遗漏了什么?是的,数据属性是文件内容所在的位置。我想说的是,您应该在该属性中发送文件的原始二进制数据,而不是formData对象。我已经编辑了我的答案。