Android:上传文件并一起填写POST正文

Android:上传文件并一起填写POST正文,第1张

Android:上传文件并一起填写POST正文

只需添加一些

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脚本的输出:

$_FILESArray(    [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)

这并不会压缩一个内容主体部分内部的所有post var,但可以完成这项工作。

您无法从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
将其设置为“开”,它也无法解决问题:

始终填充包含原始POST数据的$
HTTP_RAW_POST_DATA。否则,仅使用无法识别的MIME类型数据填充变量。但是,访问原始POST数据的首选方法是php:// input。$
HTTP_RAW_POST_DATA不适用于enctype =“ multipart / form-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-urlenpred", "formVariables")));

在PHP中:

var_dump(file_get_contents($_FILES['formVariables']['tmp_name']));

您应该得到:

字符串(21)“ b = a&c = a&d = a&Send =发送”

编辑:经过一番思考,我认为最好使用一个

StringBody
并将所有数据放入一个post变量中,然后从中进行解析,因为临时文件已完全删除,它会跳过将数据写入文件并在请求后将其删除无用的这会提高性能。这是一个例子:

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']);


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5488266.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-12
下一篇2022-12-12

发表评论

登录后才能评论

评论列表(0条)

    保存