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