我正在使用jersey-client发送带有multipart / form-data的帖子请求。第三方服务器使用非常旧版本的com.oreilly.servlet.multipart(COS)来解析它,这里的问题是how COS extracts information about content-disposition。简而言之:如果名称字段位于名称字段之前,则无法解析文件名字段 因此,它导致无法使用jersey-client发送文件部分,因为它在内容处置结束时放置了名称字段(我真的相信它没关系,因为根据内容处理中字段的RFC顺序应该无关紧要),文件名未解析且没有文件名,此第三方服务器无法将此部分识别为文件 问题是:如何设置FileDataBodyPart的内容处置保留字段的顺序?
答案 0 :(得分: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;
因此,此问题的解决方法是从此类扩展并覆盖此方法。
答案 1 :(得分: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;
}
};