2015-06-17 3 views
0

У меня есть файл, который я пытаюсь отправить с одного сервера на другой. Поскольку объект File представляет конкретное место в файловой системе, и этот файл не будет существовать на новом сервере, когда я его отправлю, я должен передать его другим способом.Файл поврежден при отправке запроса PUT через Spring RestTemplate

я понял, что лучший способ, чтобы отправить это будет простой массив байт, как и (использование Apache Commons FileUtils):

File file = <...>; 
byte[] fileByteArray = FileUtils.readFileToByteArray(file); 
restTemplate.put("http://example.com/upload/", fileByteArray); 

Затем я получить файл на другом конце так:

@RequestMapping(value = "upload/", method = RequestMethod.PUT) 
public void upload(
     @NotNull @RequestBody byte[] data 
) { 
    File file = <...>; 
    FileUtils.writeByteArrayToFile(file, data); 
} 

Однако файл на другом конце поврежден. Например, если я отправлю zip-файл и попытаюсь открыть его в Проводнике Windows, мне сказали, что он недопустим, хотя с другой стороны он отлично справился. Что происходит?

ответ

0

Проблема с отправкой по файлу как byte[]. Пружина преобразует его в String, затем превращает это String в byte[] (что эквивалентно String.getBytes()). Это создает немного отличную от byte[], чем вы начали, что вызывает коррупцию.

Вместо этого вы должны либо отправить через InputStream, либо, если вы должны отправить через byte[], отправьте его в обернутый объект.

Смежные вопросы