只需FormBodyPart
在您的MultipartEntity
.
您可以使用该StringBody
对象来提供值。
这是一个如何使用它的示例:
byte[] data = {10,10,10,10,10};
HttpClient httpClient = new DefaultHttpClient();
HttpPost postRequest = new HttpPost("server url");
ByteArrayBody bab = new ByteArrayBody(data, "image.jpg");
MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
reqEntity.addPart("image", bab);
FormBodyPart bodyPart=new FormBodyPart("formVariableName", new StringBody("formValiableValue"));
reqEntity.addPart(bodyPart);
bodyPart=new FormBodyPart("formVariableName2", new StringBody("formValiableValue2"));
reqEntity.addPart(bodyPart);
bodyPart=new FormBodyPart("formVariableName3", new StringBody("formValiableValue3"));
reqEntity.addPart(bodyPart);
postRequest.setEntity(reqEntity);
HttpResponse response = httpClient.execute(postRequest);
BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
String line = null;
while((line = in.readLine()) != null) {
System.out.println(line);
}
这是 PHP 脚本的输出:
$_FILES
Array
(
[image] => Array
(
[name] => image.jpg
[type] => application/octet-stream
[tmp_name] => /tmp/php6UHywL
[error] => 0
[size] => 5
)
)
$_POST:
Array
(
[formVariableName] => formValiableValue
[formVariableName2] => formValiableValue2
[formVariableName3] => formValiableValue3
)
这不会压缩一个内容正文部分内的所有帖子变量,但它完成了这项工作。
您无法从php://stdin或$HTTP_RAW_POST_DATA访问数据,两者都不可用于 multipart/form-data 编码。来自 PHP 文档:
php://input 是一个只读流,允许您从请求正文中读取原始数据。对于 POST 请求,最好使用 php://input 而不是 $HTTP_RAW_POST_DATA,因为它不依赖于特殊的 php.ini 指令。此外,对于那些默认情况下不填充 $HTTP_RAW_POST_DATA 的情况,与激活 always_populate_raw_post_data 相比,它可能是一种内存密集度较低的替代方案。php://input 不适用于 enctype="multipart/form-data"。
即使您设置always_populate_raw_post_data
为 On 它仍然无法解决问题:
始终填充包含原始 POST 数据的 $HTTP_RAW_POST_DATA。否则,该变量仅填充有无法识别的 MIME 类型的数据。但是,访问原始 POST 数据的首选方法是 php://input。$HTTP_RAW_POST_DATA 不适用于 enctype="multipart/form-data"。
我最好的猜测是将所有数据添加为ByteArrayBody
orStringBody
并使用它,就像您从 php://stdin 读取一样
这是一个例子ByteArrayBody
:
String testString="b=a&c=a&d=a&Send=Send";
reqEntity.addPart(new FormBodyPart("formVariables", new ByteArrayBody(testString.getBytes(), "application/x-www-form-urlencoded", "formVariables")));
在 PHP 中:
var_dump(file_get_contents($_FILES['formVariables']['tmp_name']));
你应该得到:
字符串(21)“b=a&c=a&d=a&Send=Send”
编辑:经过再三考虑,我认为最好只使用一个StringBody
并将所有数据放在一个后变量中,然后从中解析它,它会跳过将数据写入文件并在请求后将其删除,因为临时文件完全没用,这将提高性能。这是一个例子:
String testString="b=a&c=a&d=a&Send=Send";
bodyPart=new FormBodyPart("rawData", new StringBody(testString));
reqEntity.addPart(bodyPart);
然后从PHP:
var_dump($_POST['rawData']);