1

Web 服务器希望通过 html 表单上传文件。

这就是我构建 MultipartEntity 的方式,它已经有效:

FileBody filePart = new FileBody(new File("emptyFile.txt"), "text/plain");
FormBodyPart fbp = new FormBodyPart("UploadService", filePart);
MultipartEntity mpe = new MultipartEntity();  
mpe.addPart(fbp);

事实是我的数据在内存中,所以我不喜欢将它保存到磁盘的想法,所以我试图替换

FileBody filePart = new FileBody(new File("emptyFile.txt"), "text/plain");

StringBody filePart = new StringBody("");    

但是第二种方式不行,服务器返回HTTP 500异常;记录在线上的数据,我注意到唯一的区别如下:

使用 FileBody 时的 HTTP POST 跟踪:

...
Content-Disposition: form-data; name="UploadService"; filename="emptyFile.txt"
...

使用 StringBody 时的 HTTP POST 跟踪:

...
Content-Disposition: form-data; name="UploadService"
...

即,在 FileBody 上传中,指定了 StringBody 上传中未指定的“文件名”。我怎样才能解决这个问题?

4

2 回答 2

1

使用 aStringBody您将无法设置文件名。但是您可以扩展StringBody和覆盖getFilename()以不返回null

根据 的来源FormBodyPart,这应该足以具有所需的 filename-parm 参数:

 protected void generateContentDisp(final ContentBody body) {
     StringBuilder buffer = new StringBuilder();
     buffer.append("form-data; name=\"");
     buffer.append(getName());
     buffer.append("\"");
     if (body.getFilename() != null) {
         buffer.append("; filename=\"");
         buffer.append(body.getFilename());
         buffer.append("\"");
     }
     addField(MIME.CONTENT_DISPOSITION, buffer.toString());
 }
于 2012-12-26T11:26:58.873 回答
0

只是把它放在这里,因为我遇到了问题并在我的搜索中不断来到这里......类似于上面的方法,但我想它更简单。

public class StringFileBody extends FileBody {

    private String data;

    public StringFileBody( String input, ContentType contentType ) {

        super( new File( "." ), contentType );

        data = input;
    }

    public StringFileBody( String input, ContentType contentType, String fileName ) {

        super( new File( "." ), contentType, fileName );

        data = input;
    }

    @Override
    public void writeTo( OutputStream out ) throws IOException {

        out.write( data.getBytes( ) );
    }

    @Override
    public long getContentLength( ) {

        return data.getBytes( ).length;
    }
}
于 2017-12-21T19:33:37.253 回答