Mar*_*era 2 php java android file-upload multipartentity
我确实使用MultipartEntity将File发送到服务器,它在$_FILES超全局中正确显示
但我还需要填写POST正文以供阅读 php://stdin
我怎样才能做到这一点?
下面的当前片段:
ByteArrayOutputStream bos = new ByteArrayOutputStream(); // stream to hold image
bm.compress(CompressFormat.JPEG, 75, bos); //compress image
byte[] data = bos.toByteArray();
HttpClient httpClient = new DefaultHttpClient();
HttpPost postRequest = new HttpPost("REMOTE ADDRESS");
ByteArrayBody bab = new ByteArrayBody(data, "image.jpg");
MultipartEntity reqEntity = new MultipartEntity(
HttpMultipartMode.BROWSER_COMPATIBLE); // is this one causing trouble?
reqEntity.addPart("image", bab); // added image to request
// tried this with no luck
// reqEntity.addPart("", new StringBody("RAW DATA HERE"));
postRequest.setEntity(reqEntity); // set the multipart entity to http post request
HttpResponse response = httpClient.execute(postRequest);
Run Code Online (Sandbox Code Playgroud)
MultipartEntity是HttpMime 4.1.2 API的一部分,文档
Ale*_*ncu 21
只需添加一些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);
}
Run Code Online (Sandbox Code Playgroud)
这是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
)
Run Code Online (Sandbox Code Playgroud)
这并不会压缩一个内容正文部分内的所有后变量,但它会对作业进行处理.
您无法从php:// stdin或$ HTTP_RAW_POST_DATA访问数据,两者都不可用于多部分/表单数据编码.从PHP文档:
php:// input是一个只读流,允许您从请求正文中读取原始数据.在POST请求的情况下,最好使用php:// input而不是$ HTTP_RAW_POST_DATA,因为它不依赖于特殊的php.ini指令.此外,对于默认情况下未填充$ HTTP_RAW_POST_DATA的情况,它可能是激活always_populate_raw_post_data的内存密集型替代方案.php://输入不适用于enctype ="multipart/form-data".
即使你设置always_populate_raw_post_data为On它仍然无法解决问题:
始终填充包含原始POST数据的$ HTTP_RAW_POST_DATA.否则,仅使用无法识别的MIME类型的数据填充变量.但是,访问原始POST数据的首选方法是php:// input.enctype ="multipart/form-data"不提供$ HTTP_RAW_POST_DATA.
我最好的猜测是将所有数据添加为ByteArrayBody或者StringBody只是使用它,就好像你从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")));
Run Code Online (Sandbox Code Playgroud)
在PHP中:
var_dump(file_get_contents($_FILES['formVariables']['tmp_name']));
Run Code Online (Sandbox Code Playgroud)
你应该得到:
string(21)"b = a&c = a&d = a&Send = Send"
编辑:经过一番思考后,我认为最好只使用一个StringBody并将所有数据放在一个post变量中,然后从中解析它,它会跳过将数据写入文件并在请求后删除它,因为临时文件完全是没用会增加性能.这是一个例子:
String testString="b=a&c=a&d=a&Send=Send";
bodyPart=new FormBodyPart("rawData", new StringBody(testString));
reqEntity.addPart(bodyPart);
Run Code Online (Sandbox Code Playgroud)
然后从PHP:
var_dump($_POST['rawData']);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14168 次 |
| 最近记录: |