【问题标题】:Amazon S3 Create Object Error: POST requires exactly one file upload per requestAmazon S3 创建对象错误:POST 要求每个请求只上传一个文件
【发布时间】:2016-06-10 10:53:19
【问题描述】:

我正在尝试使用以下请求通过邮递员休息客户端创建一个对象。它给出了下面提到的错误。这可能是什么原因?谁能帮我解决这个问题?

请求:

POST HTTP/1.1
Host: 1465549420742testconbkt2.s3-us-west-2.amazonaws.com
x-amz-date: Fri, 10 Jun 2016 09:03:47 GMT
Authorization: xxxxxx
Content-Type: multipart/form-data;boundary=----WebKitFormBoundaryE19zNvXGzXaLvS5C
Cache-Control: no-cache

----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="file"; filename="testFile.txt"
Content-Type: text/plain


----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="acl"

public-read-write
----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="key"

testFile.txt
----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="success_action_status"

200
----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="AWSAccessKeyId"

AKIAJQJTU6FXS7TC2DTA
----WebKitFormBoundaryE19zNvXGzXaLvS5C

回复:

<Error>
    <Code>InvalidArgument</Code>
    <Message>POST requires exactly one file upload per request.</Message>
    <ArgumentName>file</ArgumentName>
    <ArgumentValue>0</ArgumentValue>
    <RequestId>B1EE3A8D9EA832AE</RequestId>
    <HostId>dqOG4gKXDXYKomDig1VD559Wc3XCLvPPB+uUiM6xKNiOVeMH+dvqDrAv47zy15qDIz/WvO+T3rQ=</HostId>
</Error>

提前致谢

【问题讨论】:

    标签: amazon-s3


    【解决方案1】:

    你的边界有错误:

    它需要比标题多“--”(2个破折号)所以:

    Content-Type: multipart/form-data;boundary=----WebKitFormBoundaryE19zNvXGzXaLvS5C
    

    应该是:

    Content-Type: multipart/form-data;boundary=------WebKitFormBoundaryE19zNvXGzXaLvS5C
    

    显然是为了发布请求

    发件人:
    HTTP POST with HttpWebRequest

    【讨论】:

    • 我尝试了你的解决方案,但还是一样。
    • 虽然您的回答不正确,但还是感谢您指出这一点!正文中的边界字符串(Content-Disposition 部分)确实比 Content-Type 标头中的边界字符串多了 2 个前导破折号。出于某种原因,约定是在边界字符串前面加上一堆破折号。在我的情况下,我没有注意到我将两个字符串设置为相同并且一直失败并出现 400 错误。
    【解决方案2】:

    文件或内容必须是表单中的最后一个字段。它下面的任何字段都将被忽略。

    http://docs.aws.amazon.com/AmazonS3/latest/dev/HTTPPOSTForms.html

    你的不是最后一个。紧随其后的是其他表单字段,这可能会让 S3 误以为您有多个文件。当然,文档中的“忽略”与我的解释并不完全一致,但这可能是上传小文件的副作用,如果这就是你正在做的事情......从大约前 20K 开始的字段如果它们位于文件之后,则上传可能不会总是被忽略。

    【讨论】:

    • 按照您的建议,我将文件表单字段移到最后。仍然没有改善。
    【解决方案3】:

    我认为每个条目的边界值都需要以-- 为前缀,并且最后一个边界值需要以-- 为后缀,如下所示(也如前所述,文件需要放在最后):

    POST HTTP/1.1
    Host: 1465549420742testconbkt2.s3-us-west-2.amazonaws.com
    x-amz-date: Fri, 10 Jun 2016 09:03:47 GMT
    Authorization: xxxxxx
    Content-Type: multipart/form-data;boundary=----WebKitFormBoundaryE19zNvXGzXaLvS5C
    Cache-Control: no-cache
    
    ------WebKitFormBoundaryE19zNvXGzXaLvS5C
    Content-Disposition: form-data; name="acl"
    
    public-read-write
    ------WebKitFormBoundaryE19zNvXGzXaLvS5C
    Content-Disposition: form-data; name="key"
    
    testFile.txt
    ------WebKitFormBoundaryE19zNvXGzXaLvS5C
    Content-Disposition: form-data; name="success_action_status"
    
    200
    ------WebKitFormBoundaryE19zNvXGzXaLvS5C
    Content-Disposition: form-data; name="AWSAccessKeyId"
    
    AKIAJQJTU6FXS7TC2DTA    
    ------WebKitFormBoundaryE19zNvXGzXaLvS5C
    
    Content-Disposition: form-data; name="file"; filename="testFile.txt"
    Content-Type: text/plain
    ------WebKitFormBoundaryE19zNvXGzXaLvS5C--
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-09
      • 1970-01-01
      • 2013-10-08
      • 2013-10-02
      • 2019-12-02
      • 2011-07-25
      • 1970-01-01
      相关资源
      最近更新 更多