2013-11-28 2 views
1

Я использую jersey-client для отправки почтовых запросов с multipart/form-data. Сторонний сервер использует очень старую версию com.oreilly.servlet.multipart (COS) для ее анализа, и проблема здесь how COS extracts information about content-disposition. В двух словах: он не может анализировать поле имени файла, если оно идет перед полем имени.
Таким образом, это приводит к невозможности отправки частей файла с помощью jersey-client, поскольку он помещает поле имени в конец содержимого-расположения (и я действительно считаю, что все в порядке, потому что согласно RFC-порядку полей в содержимом-расположении shouldn ' не имеет значения), имя файла не анализируется и без имени файла этот сторонний сервер не распознает эту часть как файл.
И возникает вопрос: как настроить контент-расположение для FileDataBodyPart, сохраняя порядок полей?Определенный порядок полей в содержании-распоряжение с jersey-клиентом

ответ

0

Я проверил исходный код класса FormDataContentDisposition и обнаружил, что он создает контент-расположение в определенном порядке

StringBuilder sb = new StringBuilder(); 
sb.append(type); 
addStringParameter(sb, "filename", fileName); 
addDateParameter(sb, "creation-date", creationDate); 
addDateParameter(sb, "modification-date", modificationDate); 
addDateParameter(sb, "read-date", readDate); 
addLongParameter(sb, "size", size); 
return sb; 

Таким образом, решение этой проблемы заключается в расширении от этого класса и переопределить этот метод.

0

Следующий код показывает обходной путь:

StreamDataBodyPart filePart = new StreamDataBodyPart("File.docx", is) { 
     @Override 
     protected FormDataContentDisposition buildContentDisposition() { 
      FormDataContentDisposition contentDisposition = new FormDataContentDisposition("form-data", getName(), getName(), null, null, null, 0) { 
       @Override 
       protected StringBuilder toStringBuffer() { 
        StringBuilder sb = new StringBuilder(); 
        sb.append(this.getType()); 
        addStringParameter(sb, "name", getName()); 
        addStringParameter(sb, "filename", getName()); 
        return sb; 
       } 
      }; 
      return contentDisposition; 
     } 
    };