2013-03-26 2 views
1

Я использую веб-службу, которая помогает мне извлекать файлы из концентратора сообщений. Тип файла может быть XML или ZIP.ZIP-файл коррумпированный выбор из приложения SOAP

Для файлов ZIP тип содержимого двоичный.

У меня есть этот кусок кода:

private String extractPayload(String filePath, AttachmentPart attach){ 

     FileOutputStream fileStream = null; 

     try { 
       DataHandler handler; 
       handler = attach.getDataHandler(); 

       File f = new File(filePath); 

       fileStream = new FileOutputStream(filePath); 

       handler.writeTo(fileStream); 

       fileStream.flush(); 

     } catch (Exception ex) { 

       logger.info("####Exception:" + ex.getMessage()); 

     } finally { 

       if (fileStream != null) 
        fileStream.close(); 

     } 

     return filePath; 

}

Теперь код работает отлично для извлечения XML-файлов, хотя, в случае ZIP-файлов, файл оказывается поврежден. Я загрузил тот же файл с помощью файловой утилиты из Центра обмена сообщениями и выяснил, что размер файла, который я получаю через приложение SOAP, составляет около 4 байтов больше, чем его фактический размер.

Обновление: Кодировка вложения 7-разрядная (если это может быть препятствование), в то время как другое вложение, содержащее другой почтовый индекс, кодируется Quote-printable. Оба zips извлекаются из одной и той же веб-службы (хотя они различаются в кодировке), и оба из них повреждены.

Редактировать: Я сильно чувствую, что проблема связана с кодировкой, в которой я получаю файл, и вот сравнение между фактическим файлом и полученным файлом вложения.

Фактический размер файла: 9031 байт Полученное Размер вложения файла: 9066 байт

Я пытался сравнивать оба файла в редакторе документов, чтобы найти различия между обоими. Оригинального файл принесенных различия файлов вложений (Binary редактор):

изд изменен на 3f, дБ изменяются на 3f, d6 изменены на 3f, 85 изменен на 3f, d0 изменены на 3f,

и так далее.

Почтовый файл содержит файл PDF и XML.

Линия старта обоих файлов похожи, начиная с ПК

ответ

3

Я предполагаю, что ваш buf является байт массива 2048. Попробуйте следующие изменения

Заменить

fileStream.write(buf); 

с этим

fileStream.write(buf, 0, n); 

Это исправить в случае, если в вашем последнем чтении вы получите только 1024 байт, то остальные 1024 байт buf будут иметь значения мусора и будут записаны в файл и испортить его.

+2

Я думаю, вы имеете в виду 'write (buf, 0, n)' - но предпосылка верна. –

+0

Пробовал уже. Проблема в том, что zis.read() выдает исключение java.util.ZipException: Недействительное действие блока. Кроме того, entry.getSize() (для получения размера записи Zip) возвращает -1. –

+0

@PriyanshuJha: * Где * это бросает это? Вы должны, по крайней мере, внести изменения, о которых говорил шазин ...потому что в настоящее время это очень реальная ошибка. –