我正在尝试向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期望的一样。经过进一步研究,我了解到即使缺少任何头参数,也会发送“签名不匹配”错误。
有迹象表明,REST保证不支持多部分/混合
,例如此问题:https://github.com/rest-assured/rest-assured/issues/374-我知道我所在组织的一个团队过去也遇到过同样的问题。
如果您愿意评估基于JVM的替代工具,我是否可以推荐空手道(免责声明:我是开发人员) - 因为它对文件上传(包括多部分/混合
)具有全面的支持。
最后我找到了解决这个问题的办法。
首先,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服务中,如我所见,它不是空的: