如何在 java rest 模板客户端中修改部分 Content-Disposition
How to modify part of the Content-Disposition in java rest template client
我正在努力使用 java spring 创建对某些内部服务的有效请求。问题在于 multipart/form-data 边界的正确负载。
环境:
java 服务器 -> (休息)http multipart/form-data -> 一些服务
(中间没有浏览器)
有效负载应如下所示:
------WebKitFormBoundaryp8mrQWOb5GiyC90y
Content-Disposition: form-data; name="files"; filename="0000.png"
Content-Type: image/png
[binary data]
------WebKitFormBoundaryp8mrQWOb5GiyC90y--
很遗憾,我无法更改此设置 "headers",我得到的是这样的信息:
--fkGT7CJaQB9-2aa8G1ePv17iHKnWSsd
Content-Disposition: form-data; name="files"
Content-Length: 170096
[binary data]
--fkGT7CJaQB9-2aa8G1ePv17iHKnWSsd--
我搜索了很多 stackoverlow 问题,但似乎没有任何效果。
这是我到目前为止所做的(生成以上有效载荷):
HashMap<String, List<String>> additionalHeaders = new HashMap<>();
String fileMd5 = "tgrlfG0pjblWZB6g1f7j5w=="; //@todo
File file = new File(systemFile.getAbsoluteFileLocation());
Path filePath = Paths.get(systemFile.getAbsoluteFileLocation());
try{
DiskFileItem fileItem = new DiskFileItem("file", "image/png", false, file.getName(), (int) file.length() , file.getParentFile());
InputStream input = new FileInputStream(file);
OutputStream os = fileItem.getOutputStream();
int ret = input.read();
while ( ret != -1 )
{
os.write(ret);
ret = input.read();
}
os.flush();
MultipartFile multipartFile = new CommonsMultipartFile(fileItem);
MultiValueMap<String, Object> parts =
new LinkedMultiValueMap<>();
ByteArrayResource resource = new ByteArrayResource(multipartFile.getBytes());
parts.add("files", resource);
additionalHeaders.put("Content-MD5", Collections.singletonList(fileMd5));
additionalHeaders.put("Content-Disposition", Collections.singletonList("attachment; filename=\""+systemFile.getFilenameWithExtension()+"\""));
ResponseEntity<FrpFileServer> responseEntity = formDataRestClient.post(this, parts, FrpFileServer.class, isServerSide, frpToken.getTokenId(), additionalHeaders, MediaType.MULTIPART_FORM_DATA);
return responseEntity.getBody();
} catch (IOException e) {
return null;
}
formDataRestClient 通过 RestTemplate 构建请求的其余部分
public <K, T> ResponseEntity<T> post(RestClientInterface reference, K requestClass, Class<T> responseClass, boolean isServerSide, String resourceId, HashMap<String, List<String>> additionalHeaders, MediaType contentType) {
我编写了一个通用的 REST 客户端,您可以在任何基于 java 的应用程序或框架中使用它,请参阅 GIT 删除方法的来源如何在请求中加载任何内容 header 我在哪里正在通过授权- https://github.com/gajeralalji/JAVA-REST-Client/wiki
检查 REST-client.java class 的来源,如果您仍然遇到任何问题,请告诉我。
好的,我已经用这个替换资源创建解决了我的问题:
ByteArrayResource resource = new ByteArrayResource(multipartFile.getBytes()){
@Override
public String getFilename() {
return systemFile.getFilenameWithExtension();
}
};
多亏了这一点,restTemplate 以正确的方式处理它的魔力:)
我正在努力使用 java spring 创建对某些内部服务的有效请求。问题在于 multipart/form-data 边界的正确负载。
环境: java 服务器 -> (休息)http multipart/form-data -> 一些服务
(中间没有浏览器)
有效负载应如下所示:
------WebKitFormBoundaryp8mrQWOb5GiyC90y Content-Disposition: form-data; name="files"; filename="0000.png" Content-Type: image/png [binary data] ------WebKitFormBoundaryp8mrQWOb5GiyC90y--
很遗憾,我无法更改此设置 "headers",我得到的是这样的信息:
--fkGT7CJaQB9-2aa8G1ePv17iHKnWSsd Content-Disposition: form-data; name="files" Content-Length: 170096 [binary data] --fkGT7CJaQB9-2aa8G1ePv17iHKnWSsd--
我搜索了很多 stackoverlow 问题,但似乎没有任何效果。 这是我到目前为止所做的(生成以上有效载荷):
HashMap<String, List<String>> additionalHeaders = new HashMap<>();
String fileMd5 = "tgrlfG0pjblWZB6g1f7j5w=="; //@todo
File file = new File(systemFile.getAbsoluteFileLocation());
Path filePath = Paths.get(systemFile.getAbsoluteFileLocation());
try{
DiskFileItem fileItem = new DiskFileItem("file", "image/png", false, file.getName(), (int) file.length() , file.getParentFile());
InputStream input = new FileInputStream(file);
OutputStream os = fileItem.getOutputStream();
int ret = input.read();
while ( ret != -1 )
{
os.write(ret);
ret = input.read();
}
os.flush();
MultipartFile multipartFile = new CommonsMultipartFile(fileItem);
MultiValueMap<String, Object> parts =
new LinkedMultiValueMap<>();
ByteArrayResource resource = new ByteArrayResource(multipartFile.getBytes());
parts.add("files", resource);
additionalHeaders.put("Content-MD5", Collections.singletonList(fileMd5));
additionalHeaders.put("Content-Disposition", Collections.singletonList("attachment; filename=\""+systemFile.getFilenameWithExtension()+"\""));
ResponseEntity<FrpFileServer> responseEntity = formDataRestClient.post(this, parts, FrpFileServer.class, isServerSide, frpToken.getTokenId(), additionalHeaders, MediaType.MULTIPART_FORM_DATA);
return responseEntity.getBody();
} catch (IOException e) {
return null;
}
formDataRestClient 通过 RestTemplate 构建请求的其余部分
public <K, T> ResponseEntity<T> post(RestClientInterface reference, K requestClass, Class<T> responseClass, boolean isServerSide, String resourceId, HashMap<String, List<String>> additionalHeaders, MediaType contentType) {
我编写了一个通用的 REST 客户端,您可以在任何基于 java 的应用程序或框架中使用它,请参阅 GIT 删除方法的来源如何在请求中加载任何内容 header 我在哪里正在通过授权- https://github.com/gajeralalji/JAVA-REST-Client/wiki
检查 REST-client.java class 的来源,如果您仍然遇到任何问题,请告诉我。
好的,我已经用这个替换资源创建解决了我的问题:
ByteArrayResource resource = new ByteArrayResource(multipartFile.getBytes()){
@Override
public String getFilename() {
return systemFile.getFilenameWithExtension();
}
};
多亏了这一点,restTemplate 以正确的方式处理它的魔力:)