HttpServletRequest InputStream поврежден? - PullRequest
3 голосов
/ 17 июня 2011

Я получаю сообщение SOAP через Java-сервлет с частью вложения, содержащей многоэлементный MIME. Делаем это:

 InputStream inputStream = request.getInputStream();           
 byte[] data = IOUtils.toByteArray(inputStream);

 File file = new File("/usr/local/user/message.txt");
 FileOutputStream fos = new FileOutputStream(file);
 fos.write(data);
 fos.close();

Дает мне поврежденные данные для двоичного кода в MIME из нескольких частей. Кто-нибудь знает, почему это происходит? Я скопировал двоичные данные в файл и изменил расширение файла на соответствующее расширение изображения, но получаю поврежденное изображение. Сравнение шестнадцатеричных данных message.txt и файла .snoop показывает, что существуют небольшие различия в шестнадцатеричных данных, вызывающих искажение. В данных ASCII не было никаких изменений. Спасибо.

Существует искажение, так как вы можете видеть, что картинка выглядит правильно с самого начала, но через некоторое время она начинает выглядеть странно, потому что шестнадцатеричные значения неверны. Например: 06 04 04 04 04 04 06 04 04 06 0a от клиента становится 06 04 04 04 04 04 06 04 04 06 0D после того, как я сделаю выше.

Ответы [ 2 ]

1 голос
/ 17 июня 2011

Судя по комментариям, файл записывается на диск правильно (это моя интерпретация).

WinSCP используется для передачи файла с компьютера (Linux / Unix) на компьютер с Windows. Режим передачи, используемый в процессе передачи, может привести к тому, что WinSCP преобразует все окончания строк в стиле Unix в окончания строк в стиле Windows, или наоборот, в зависимости от того, откуда произошла передача. Это происходит, когда для передачи файла используется текстовый режим или когда WinSCP разрешено определять, следует ли использовать текстовый или двоичный режим для передачи файла. Возможно, вы установили его в режим по умолчанию, поэтому принудительно передайте файл в двоичном формате; если это не сработало, вам нужно будет продолжить расследование.

Если WinSCP, кажется, является причиной этой проблемы, вы можете подтвердить это, просмотрев двоичное содержимое файлов на обеих платформах. Вы можете использовать xxd в Linux / Unix . В Windows одна из утилит, перечисленных в , поможет в этом вопросе .

Вы также можете использовать любые другие протоколы копирования файлов, такие как FTP, SFTP или даже использовать NFS или Samba для передачи файлов, и установить WinSCP в качестве причины.

0 голосов
/ 17 июня 2011

Для составного MIME вы можете использовать библиотеку Apache Fileupload. Вы можете найти его здесь:

Apache Fileupload путь загрузки

Учебник для начинающих

...