1

我正在使用 jersey-client 发送带有 multipart/form-data 的 post 请求。第三方服务器使用非常旧版本的 com.oreilly.servlet.multipart (COS) 来解析它,这里的问题是COS 如何提取关于 content-disposition 的信息。简而言之:如果文件名字段位于名称字段之前,则它无法解析文件名字段。
因此,它导致无法使用 jersey-client 发送文件部分,因为它将 name 字段放在 content-disposition 的末尾(我真的相信这没关系,因为根据 RFC 中的 content-disposition 字段顺序应该无关紧要),文件名没有被解析并且没有文件名,这个第三方服务器不能把这部分识别为文件。
问题是:如何为 FileDataBodyPart 设置内容处置保留字段的顺序?

4

2 回答 2

0

我检查了 FormDataContentDisposition 类的源代码,发现它以一定的顺序构造了 content-disposition

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;

因此,解决此问题的方法是从此类扩展并覆盖此方法。

于 2013-11-28T10:48:41.997 回答
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;
        }
    };
于 2015-04-01T15:28:01.897 回答