首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在spring boot中使用rest模板来使用多部分表单数据

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

Stack Overflow用户
提问于 2019-07-30 17:44:36
回答 2查看 2.3K关注 0票数 1

我使用了以下代码来使用multipart/form-data。但是在那里我不能为文件指定content-type。如何在spring中传递content-type,filename,filename内容?

代码语言:javascript
复制
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);

我使用MultiValueMap来添加文件名和它的内容,并且我不能传递文件的内容类型。当执行时,我收到400个错误请求。你能帮上忙吗?

我之前已经尝试过了,这里也得到了400个坏的requests.Need帮助。

代码语言:javascript
复制
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);
EN

回答 2

Stack Overflow用户

发布于 2019-07-31 14:19:03

准备文件零件

代码语言:javascript
复制
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);

然后准备消息部分

代码语言:javascript
复制
HttpHeaders messagePartHeaders = new HttpHeaders();
messagePartHeaders.setContentType(MediaType.TEXT_PLAIN);
HttpEntity messagePart = new HttpEntity<>(message, messagePartHeaders);

然后将各个部分组合成一个多部分请求实体

代码语言:javascript
复制
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);

并最终执行请求

代码语言:javascript
复制
ResponseEntity<String> response = restTemplate.postForEntity(url, requestEntity, String.class);
票数 2
EN

Stack Overflow用户

发布于 2019-07-31 18:10:39

谢谢你,我试过了,但还是收到了400个错误请求。在这里,我使用了tcpdump,得到的响应如下:

代码语言:javascript
复制
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模板的响应是有效的:

代码语言:javascript
复制
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--
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57268760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档