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