Java 如何在spring boot中使用rest模板使用多部分表单数据

Java 如何在spring boot中使用rest模板使用多部分表单数据,java,spring-boot,resttemplate,Java,Spring Boot,Resttemplate,我使用以下代码来使用多部分/表单数据。但是在那里我不能为文件指定内容类型。如何在spring中传递内容类型、文件名、文件名内容 HttpHeaders header = new HttpHeaders(); header.add("Token", "_45378ffb-e366-45ec-9ac4-eb968c57aee3"); header.setContentType(MediaType.MULTIPART_FORM_DATA); MultiValueMap<String, Ob

我使用以下代码来使用
多部分/表单数据
。但是在那里我不能为文件指定
内容类型。如何在spring中传递
内容类型
、文件名、文件名内容

HttpHeaders header = new HttpHeaders();
header.add("Token", "_45378ffb-e366-45ec-9ac4-eb968c57aee3");   header.setContentType(MediaType.MULTIPART_FORM_DATA);

MultiValueMap<String, Object> fileMap = new LinkedMultiValueMap<>();
fileMap.add(filename, msg.getBytes());
fileMap.add("OrderRequest", message);

HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<MultiValueMap<String, Object>>(fileMap, header);

ResponseEntity<String> response = restTemplate.postForEntity(url, requestEntity,String.class);
HttpHeaders header=新的HttpHeaders();
标题。添加(“令牌”,“_45378ffb-e366-45ec-9ac4-eb968c57aee3”);header.setContentType(MediaType.MULTIPART\u FORM\u DATA);
MultiValueMap fileMap=新链接的MultiValueMap();
add(文件名,msg.getBytes());
添加(“OrderRequest”,消息);
HttpEntity requestEntity=新的HttpEntity(文件映射,标题);
ResponseEntity response=restTemplate.postForEntity(url、requestEntity、String.class);
我使用多值映射添加文件名及其内容,但无法传递文件的内容类型。 执行时,我收到400个错误请求。你能帮忙吗

我以前试过如下,这里也收到400个错误请求。这里需要帮助

HttpHeaders headers = new HttpHeaders();
headers.add("token", "_fd470451-cb5d-4fa2-8e18-0bf8a7a92d04");
headers.add("Content-Type", "multipart/form-data; boundary=\"---boundary\"");

MultiValueMap<String, Object> fileMap = new LinkedMultiValueMap<>();

ContentDisposition contentDisposition = ContentDisposition.builder("form-data").name(filename).filename(filename).build();

fileMap.add(contentDisposition.toString() + "\n" + " Content-Type: application/octet-stream", msg);

ContentDisposition contentDisposition1 = ContentDisposition.builder("form-data").name("OrderRequest").filename("OrderRequest").build();

fileMap.add(contentDisposition1.toString(), message);

HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<MultiValueMap<String, Object>>(fileMap,headers);

ResponseEntity<String> response = restTemplate.postForEntity(url, requestEntity, String.class);
HttpHeaders=newhttpheaders();
标题。添加(“令牌”,即“fd470451-cb5d-4fa2-8e18-0bf8a7a92d04”);
添加(“内容类型”、“多部分/表单数据;边界=\”--boundary\”);
MultiValueMap fileMap=新链接的MultiValueMap();
ContentDisposition ContentDisposition=ContentDisposition.builder(“表单数据”).name(文件名).filename(文件名).build();
添加(contentDisposition.toString()+“\n”+“内容类型:应用程序/八位字节流”,msg);
contentDisposition1=ContentDisposition.builder(“表单数据”).name(“OrderRequest”).filename(“OrderRequest”).build();
添加(contentDisposition1.toString(),消息);
HttpEntity requestEntity=新的HttpEntity(文件映射,标题);
ResponseEntity response=restTemplate.postForEntity(url、requestEntity、String.class);
准备文件部分

HttpHeaders filePartHeaders = new HttpHeaders();
filePartHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
HttpEntity filePart = new HttpEntity<>(new ByteArrayResource(msg.getBytes()) {
    @Override
    public String getFilename() {
        return filename;
    }
}, filePartHeaders);
HttpHeaders filePartHeaders=新的HttpHeaders();
filePartHeaders.setContentType(MediaType.APPLICATION\u OCTET\u STREAM);
HttpEntity filePart=新的HttpEntity(新的ByteArrayResource(msg.getBytes()){
@凌驾
公共字符串getFilename(){
返回文件名;
}
},filePartHeaders);
然后准备消息部分

HttpHeaders messagePartHeaders = new HttpHeaders();
messagePartHeaders.setContentType(MediaType.TEXT_PLAIN);
HttpEntity messagePart = new HttpEntity<>(message, messagePartHeaders);
HttpHeaders messagePartHeaders=新的HttpHeaders();
messagePartHeaders.setContentType(MediaType.TEXT\u PLAIN);
HttpEntity messagePart=新的HttpEntity(消息,messagePartHeaders);
然后将部分组合成一个多部分请求实体

HttpHeaders header = new HttpHeaders();
header.add("Token", "_45378ffb-e366-45ec-9ac4-eb968c57aee3");
header.setContentType(MediaType.MULTIPART_FORM_DATA);

MultiValueMap<String, Object> multiMap = new LinkedMultiValueMap<>();
multiMap.add(filename, filePart);
multiMap.add("OrderRequest", messagePart);

HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(multiMap, header);
HttpHeaders header=新的HttpHeaders();
标题。添加(“令牌”,“_45378ffb-e366-45ec-9ac4-eb968c57aee3”);
header.setContentType(MediaType.MULTIPART\u FORM\u DATA);
MultiValueMap multiMap=新链接的MultiValueMap();
添加(文件名,文件部分);
添加(“OrderRequest”,messagePart);
HttpEntity requestEntity=新的HttpEntity(多映射,标题);
最后执行请求

ResponseEntity<String> response = restTemplate.postForEntity(url, requestEntity, String.class);
ResponseEntity response=restemplate.postForEntity(url、requestEntity、String.class);
谢谢, 我试过了,但又收到了400个错误的请求。在这里,我使用了tcpdump并得到如下响应:

POST XXXXXXXXXXXXXXXXXXXXX
Accept: text/plain, application/json, application/*+json, */*
Content-Type: multipart/form-data;charset=UTF-8;boundary=XXXXXXXXXXXXXXXX
Token: XXXXXXXXXXXXXXXXXXXXXXXXXXX
User-Agent: Java/1.8.0_201
Host: XXXXXXXXXXXXXXXXXXXXXXXXXX
Connection: keep-alive
Content-Length: 1003

�bA]fG
�k�?A�--XXXXXXXXXXXXXXXXXXXX
Content-Disposition: form-data; name=filename; filename=fileName
Content-Type: application/octet-stream
Content-Length: 511

MSH|^~\&|GHHHH v2012007|HL93765411|GHH|DHM|20170725121244||ORM^O01|ghjk09876|P|2.3.1|6||AL|NE|AU|||
PID|1|||11057^^^GPC Test Practice^MR^GPC Test Practice|XXX^XXX^^^jjj^^L||19920321|F|||188 HEIGHTS DR^^ROBINA^QLD^4226^^C|||^ORN^PH^^^^04
01817188^||||||||||||||||
PV1|1|O||||||2121331W^BHAR^NAV^^^MR.^^^AUSHICPR|2121331W^BHAR^NAV^^^MR.^^^AUSHICPR|||||||||||
ORC|NW|10188-1||10188||||||||^Admin^Mr.
OBR|1|10188-1||T001^Histopathology^LN|||201707251212||||L|||||^Admin^Mr.||||||||LAB
BLG||F
--XXXXXXXXXXXXXXXXXX
Content-Disposition: form-data; name="FileName1"
Content-Type: application/json
Content-Length: 133

{"client_software_version":"XXX","batch_id":"XXXXX","order_files_sent":["fileName"],"client_software_name":"XXXXX"}
--XXXXXXXXXXXX--
下面的响应是rest模板的预期响应。这里需要帮助。 它用于以下tcpdump响应,我们在不使用rest模板的情况下得到的响应是:

POST XXXXXXXXXXXXXXXXX
token: XXXXXXXXXXXXXXXXXXXXXXXXXX
content-type: multipart/form-data; boundary="---boundary"
Content-Length: 940
Host: XXXXXXXXXXXXXXXXXXXXXXXXXXXX
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.5.3 (Java/1.8.0_201)
Accept-Encoding: gzip,deflate

-----boundary
Content-Disposition: form-data; name="fileName"; filename="fileName"
Content-Type: application/octet-stream

MSH|^~\&|GHHHH v2012007|HL93765411|GHH|DHM|20170725121244||ORM^O01|ghjk09876|P|2.3.1|6||AL|NE|AU|||
PID|1|||11057^^^GPC Test Practice^MR^GPC Test Practice|XXX^XXX^^^jjj^^L||19920321|F|||188 HEIGHTS DR^^ROBINA^QLD^4226^^C|||^ORN^PH^^^^04
01817188^||||||||||||||||
PV1|1|O||||||2121331W^BHAR^NAV^^^MR.^^^AUSHICPR|2121331W^BHAR^NAV^^^MR.^^^AUSHICPR|||||||||||
ORC|NW|10188-1||10188||||||||^Admin^Mr.
OBR|1|10188-1||T001^Histopathology^LN|||201707251212||||L|||||^Admin^Mr.||||||||LAB
BLG||F
-----boundary
Content-Disposition: form-data; name="filename1"; filename="filename1"
Content-Type: application/json; charset=UTF-8

{"client_software_version":"XXX","batch_id":"XXXXX","order_files_sent":["fileName"],"client_software_name":"XXXXX"}
-----boundary--