Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
防止Javascript在文件上载到S3时添加元数据_Javascript_Jquery_Python 3.x_Amazon S3_Boto3 - Fatal编程技术网

防止Javascript在文件上载到S3时添加元数据

防止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

基本上,我愿意通过浏览器将文件直接上传到S3,也就是说,没有任何web服务器充当这样的中间件或代理

因此,我使用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。但是当我打开文件时,我看到奇怪的元数据像这样被添加到文件的顶部

-----------------------------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
    文件:

  • 发送表单数据:(这用于未放置的POST URL
    • 这实际上将
      内容处置
      头添加到问题中提到的最终文件中
  • 发送原始二进制数据(推荐的方式和使用PUT url的方式!):
    • 文件已正确上载,并且未包含
      内容处置
      标题
    您是否可以尝试在根本不使用
    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对象。我已经编辑了我的答案。