Определенный порядок полей в content-disposition с jersey-client

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


person mkrakhin    schedule 28.11.2013    source источник


Ответы (2)


Я проверил исходный код класса 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;

Итак, обходной путь для этой проблемы - расширить этот класс и переопределить этот метод.

person mkrakhin    schedule 28.11.2013

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

    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;
        }
    };
person Mauricio Coria    schedule 01.04.2015