如何使用Apache httpclient获取自定义Content-Disposition行?

时间:2013-12-19 02:50:40

标签: java apache apache-httpclient-4.x

我正在使用答案here尝试通过数据上传发出POST请求,但我从服务器端获得了不寻常的要求。服务器是一个PHP脚本,需要filenameContent-Disposition,因为它需要上传文件。

Content-Disposition: form-data; name="file"; filename="-"

但是,在客户端,我想发布内存缓冲区(在本例中为String)而不是文件,但让服务器将其处理为文件上传。

但是,使用StringBody我无法在filename行添加所需的Content-Disposition字段。因此,我尝试使用FormBodyPart,但这只是将filename放在一个单独的行上。

HttpPost httppost = new HttpPost(url);
MultipartEntity entity = new MultipartEntity();
ContentBody body = new StringBody(data,                              
         org.apache.http.entity.ContentType.APPLICATION_OCTET_STREAM);
FormBodyPart fbp = new FormBodyPart("file", body); 
fbp.addField("filename", "-");                     
entity.addPart(fbp);                               
httppost.setEntity(entity);            

如果没有先将filename写入文件,然后再将其读回来,我怎样才能在Content-Disposition行中获得String

2 个答案:

答案 0 :(得分:4)

试试这个

StringBody stuff = new StringBody("stuff");
FormBodyPart customBodyPart = new FormBodyPart("file", stuff) {

    @Override
    protected void generateContentDisp(final ContentBody body) {
        StringBuilder buffer = new StringBuilder();
        buffer.append("form-data; name=\"");
        buffer.append(getName());
        buffer.append("\"");
        buffer.append("; filename=\"-\"");
        addField(MIME.CONTENT_DISPOSITION, buffer.toString());
    }

};
MultipartEntity entity = new MultipartEntity();
entity.addPart(customBodyPart);

答案 1 :(得分:1)

作为创建额外匿名内部类并为受保护方法添加副作用的更清晰的替代方法,请使用FormBodyPartBuilder

StringBody stuff = new StringBody("stuff");

StringBuilder buffer = new StringBuilder();
    buffer.append("form-data; name=\"");
    buffer.append(getName());
    buffer.append("\"");
    buffer.append("; filename=\"-\"");
String contentDisposition = buffer.toString();

FormBodyPartBuilder partBuilder = FormBodyPartBuilder.create("file", stuff);
partBuilder.setField(MIME.CONTENT_DISPOSITION, contentDisposition);

FormBodyPart fbp = partBuilder.build();