[英]How to set content-type for the file in multipart upload when using RestTemplate (from a rest client)
我正在尝试上传的文件将始终是一个xml文件。 我想将content-type设置为application / xml这是我的代码:
MultiValueMap<String, Object parts = new LinkedMultiValueMap<String,
Object(); parts.add("subject", "some info");
ByteArrayResource xmlFile = new ByteArrayResource(stringWithXMLcontent.getBytes("UTF-8")){
@Override
public String getFilename(){
return documentName;
}
};
parts.add("attachment", xmlFile);
//sending the request using RestTemplate template;, the request is successfull
String result = template.postForObject(getRestURI(), httpEntity,String.class);
//but the content-type of file is 'application/octet-stream'
原始请求如下所示:
Content-Type:
multipart/form-data;boundary=gbTw7ZJbcdbHIeCRqdX81DVTFfA-oteHHEqgmlz
User-Agent: Java/1.7.0_67 Host: some.host Connection: keep-alive
Content-Length: 202866
--gbTw7ZJbcdbHIeCRqdX81DVTFfA-oteHHEqgmlz Content-Disposition: form-data; name="subject" Content-Type: text/plain;charset=ISO-8859-1
Content-Length: 19
some info
--gbTw7ZJbcdbHIeCRqdX81DVTFfA-oteHHEqgmlz Content-Disposition: form-data; name="attachment"; filename="filename.xml" Content-Type:
application/octet-stream Content-Length: 201402
....xml file contents here ..
文件的内容类型生成为'application / octet-stream',我希望它是'application / xml'我如何设置文件的内容类型?
我从这个链接中获取提示后想出了解决方案:
使用带有spring for android的压缩jpeg字节数组进行多部分发布请求
解决方法是将ByteArrayResource放在带有必需头的HttpEntity中,并将HttpEntity添加到Multivaluemap(而不是添加ByteArrayResource本身。)
码:
Resource xmlFile = new ByteArrayResource(stringWithXMLcontent.getBytes("UTF-8")){
@Override
public String getFilename(){
return documentName;
}
};
HttpHeaders xmlHeaders = new HttpHeaders();
xmlHeaders.setContentType(MediaType.APPLICATION_XML);
HttpEntity<Resource> xmlEntity = new HttpEntity<Resource>(xmlFile, xmlHeaders);
parts.add("attachment", xmlEntity);
我没有使用RestTemplate,但我过去使用过HttpClient - 这就是我传递身体部位的方法 -
MultipartEntityBuilder eb = MultipartEntityBuilder.create().setBoundary(MULTIPART_BOUNDARY)
.addTextBody(BODYPART_ENTITY, key, ContentType.create("application/xml", Charset.forName("UTF-8")));
您将不得不在RestTemplate中查看可以采用内容类型的API
由于我无法评论@RGR的答案,我将此作为新答案发布,尽管RGR的答案绝对正确。
问题是,Sprint RestTemplates使用FormHttpMessageConverter发送多部分请求。 此转换器检测从Resource继承的所有内容,并将其用作请求的“文件”部分。 例如,如果您使用MultiValueMap,只要添加“资源”,您添加的每个属性都将在其自己的部分中发送...-->设置文件名,Mime-Type,length,..将不会成为“档案部分“。
不是答案,但它解释了为什么必须扩展ByteArrayResource以返回文件名并作为请求的唯一部分发送。 发送多个文件将适用于MultiValueMap
SPR-13571在Spring 4.3中修复了这种行为
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.