当前位置: 首页 > 知识库问答 >
问题:

使用放心多部分上传文件到S3

谷德本
2023-03-14

我正在尝试向S3发出上传请求,以便上传一个文件。在我目前掌握的最可靠的代码下面,

String putURL = "A lengthy URL that is generated dynmaically";
String fileId = "A random 40 digit key generated by our server";
String cKey = "some key given by amazon";
String cMD5 = "some md5 hash value";

Response r = given().contentType("multipart/mixed").
                headers("x-amz-header1",cKey,
                        "x-amz-header2",cMD5,
                        "x-amz-header7",accountId,
                        "x-amz-header6",fileId,
                        "x-amz-header5","abc",
                        "x-amz-header4","image/jpeg",
                        "x-amz-header3","true",
                        "Content-Type","application/octet-stream").
                multiPart(new File("src/test/resources/media/ToBeRemoved.jpg")).
                put(putURL);
System.out.println("*********Response code: "+r.getStatusCode());

我总是从服务器收到400(错误请求)。我不确定我是否正确使用了多部分上传。

但是当我使用像POSTMAN这样的任何Rest客户端做同样的事情时,它工作得很好,

PUT <A lengthy URL that is generated dynmaically>
Host: abcd.s3-accelerate.amazonaws.com
x-amz-header1: cKey
x-amz-header2:cMD5
x-amz-header7:accountId
x-amz-header6:fileId
x-amz-header5:abc
x-amz-header4:image/jpeg
x-amz-header3:true
Content-Type:application/octet-stream"
Cache-Control: no-cache
Postman-Token: 687761ef-e059-4a07-eee4-9755931d060a

这将是有帮助的,如果有人可以抛出一些光在多部分上传放心。

我已经查看了以下链接,

  • 放心文档
  • 放心的示例

编辑1:

我试着将上面的邮递员请求转换成curl,并用CURL试了试,即使这样也没问题。

所以我在放心中使用multipart的方式有问题。

编辑2:

事实证明,我使用放心正确,我从S3得到403签名不匹配错误。尽管它在日志中显示的签名与AWS期望的一样。经过进一步研究,我了解到即使缺少任何头参数,也会发送“签名不匹配”错误。

共有2个答案

卫弘图
2023-03-14

有迹象表明,REST保证不支持多部分/混合,例如此问题:https://github.com/rest-assured/rest-assured/issues/374-我知道我所在组织的一个团队过去也遇到过同样的问题。

如果您愿意评估基于JVM的替代工具,我是否可以推荐空手道(免责声明:我是开发人员) - 因为它对文件上传(包括多部分/混合)具有全面的支持。

司寇山
2023-03-14

最后我找到了解决这个问题的办法。

首先,URL已经被编码。所以我不得不指示RA不要再编码了,

given().urlEncodingEnabled(false). ...

其次,AWS 预计字符集为空。您可以使用下面的代码行指示RA执行此操作,

given().
 config(RestAssured.config().encoderConfig(EncoderConfig.encoderConfig().appendDefaultContentCharsetToContentTypeIfUndefined(false))).

参考链接:

GitHub问题链接,讨论此特定问题。

特别感谢我的朋友Saurabh,他帮助我分析了这个问题,并引导我朝着正确的方向前进,帮助我在线找到解决方案。

 类似资料:
  • 如有任何帮助,不胜感激。

  • 我正在尝试复制一个邮递员放置请求,其中它正在代码给出的S3位置上传csv文件。 网址就像https://us-east-1-e9qpbo283.s3.amazonaws.com/bulk-bucket/a4894e7b-7e42-4fcc-9f84-e7n00db6d581/input/file 查询参数为

  • 我写了一个可以上传文件到服务器的服务,现在我正在放心地编写它的集成测试。功能代码如下: 如果我添加标题信息“content-type=multipart/form-data”,我将得到这样的消息:“400-Request不是一个多部分请求,有关更多信息,请参见详细信息”。这部分也让我感到困惑,因为在上面的图像中,您可以看到我正在发送一个“表单数据”文件,这怎么可能不是一个多部分请求呢? 不管怎样,

  • 我需要发送一个视频文件和JSON对象在放心的post调用。 我不能在放心地使用multipart时使用application/json。我显式地硬编码了表单param中的值,并以multipart的形式发送了媒体文件,现在它工作得很好。 如何在单个内部对象中发送所有表单参数数据。

  • 在Android中使用OKHTTP以多部分方式上传单个大文件(更具体地说,上传到s3)时,我有什么选择?

  • 我正在Spring controller中努力实现多部分文件上传。我读过很多问题,谷歌,但似乎什么都不管用。 我明白了 我的BE控制器: FE,angularJS: HTML: 还有应用程序。属性包括: 更新: 当我按照@Byeon0gam的建议从我的控制器中删除@RequestParam时,我不再会遇到这个错误,但是我的文件在控制器中是空的。虽然在FE服务中,如我所见,它不是空的: