Как изменить часть Content-Disposition в клиентском шаблоне отдыха Java - PullRequest
0 голосов
/ 26 июня 2018

Я пытаюсь создать действительный запрос к какому-либо внутреннему сервису, используя 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--

К сожалению, я не могу изменить эти "заголовки", и я получаю что-то вроде этого:

 --fkGT7CJaQB9-2aa8G1ePv17iHKnWSsd
Content-Disposition: form-data; name="files"
Content-Length: 170096

[binary data]

--fkGT7CJaQB9-2aa8G1ePv17iHKnWSsd--

Я искал много вопросов на стеке, но ничего не помогло. Это то, что я делал до сих пор (генерирует выше полезную нагрузку):

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) {

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Хорошо, я исправил проблему с заменой создания ресурса следующим:

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

Благодаря этому restTemplate правильно обрабатывает магию:)

0 голосов
/ 27 июня 2018

Я написал один универсальный REST-клиент, который вы можете использовать в любом Java-приложении или фреймворке. См. Источник метода удаления GIT, как загрузить что-либо в заголовок запроса, где я передаю Authorization- https://github.com/gajeralalji/JAVA-REST-Client/wiki

проверьте источник класса REST-client.java и сообщите мне, если у вас все еще есть какие-либо проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...