【问题标题】:How to modify part of the Content-Disposition in java rest template client如何在 java rest 模板客户端中修改部分 Content-Disposition
【发布时间】:2018-06-26 14:55:44
【问题描述】:

我正在努力使用 java spring 创建对某些内部服务的有效请求。问题在于多部分/表单数据边界的有效负载。

环境: java server -> (rest) http multipart/form-data -> 一些服务

(中间没有浏览器)

有效载荷应如下所示:

------WebKitFormBoundaryp8mrQWOb5GiyC90y 内容处置:表单数据;名称="文件";文件名="0000.png" 内容类型:图片/png [二进制数据] ------WebKitFormBoundaryp8mrQWOb5GiyC90y--

不幸的是,我无法更改此“标题”,我得到的是这样的:

--fkGT7CJaQB9-2aa8G1ePv17iHKnWSsd 内容处置:表单数据;名称="文件" 内容长度:170096 [二进制数据] --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) {

【问题讨论】:

    标签: java spring upload multipartform-data resttemplate


    【解决方案1】:

    好的,我已经解决了用这个替换资源创建的问题:

    ByteArrayResource resource = new ByteArrayResource(multipartFile.getBytes()){
        @Override
        public String getFilename() {
            return systemFile.getFilenameWithExtension();
        }
    };
    

    多亏了这一点,restTemplate 以适当的方式处理了它的魔力 :)

    【讨论】:

      【解决方案2】:

      我编写了一个通用 REST 客户端,您可以在任何基于 Java 的应用程序或框架中使用它,请参阅删除方法的 GIT 源如何在我传递授权的请求标头中加载任何内容-https://github.com/gajeralalji/JAVA-REST-Client/wiki

      检查 REST-client.java 类的源代码,如果您仍然遇到任何问题,请告诉我。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-05
        • 2012-06-23
        • 1970-01-01
        • 1970-01-01
        • 2013-03-18
        相关资源
        最近更新 更多