我正在使用答案here尝试通过数据上传发出POST
请求,但我从服务器端获得了不寻常的要求。服务器是一个PHP脚本,需要filename
行Content-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
?
答案 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();