当前位置: 首页 > 面试题库 >

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

谭新知
2023-03-14
问题内容

我确实使用MultipartEntity将文件发送到服务器,它在$_FILESsuperglobal 中正确显示

但是我还需要填写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);

MultipartEntity是HttpMime 4.1.2 API
文档的一部分


问题答案:

只需添加一些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
)

这并不会压缩一个内容主体部分内部的所有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-urlencoded", "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']);


 类似资料:
  • 我在失败的填充运行中所做的: 文件: 同样,任何帮助解决这个问题都是欢迎的! 更新: mkl在评论中要求创建fillsigned PDF的代码。到目前为止,我了解到,只有签名就足够了,让上面的填充代码在之后失败。下面是签名代码中的一些例外: 问候, 丹尼尔

  • 问题内容: 我想使用将文件(特别是图像)上传到REST Server 。我已经导入/添加了构建路径和。而且我在堆栈跟踪中收到以下错误。 这有效吗? HTTP POST代码 堆栈跟踪 问题答案: 您似乎缺少依赖项。 我有,,并用和在我的类路径罐子。 我也使用而不是使用header属性。 查看Internet媒体类型以了解更多详细信息

  • 主要内容:本节引言,1.项目用到的图片上传的关键方法:,2.使用HttpConnection上传文件:,本节小结:本节引言 本节和下一节文件下载一样,慎入...现在实际开发涉及文件上传不会自己写上传代码,一般 会集成第三网络库来做图片上传,比如android-async-http,okhttp等,另外还有七牛也提供 了下载和上传的API,喜欢的可以去官网查看相关的API文档!本节的话有兴趣看看就好! 1.项目用到的图片上传的关键方法: 思前想后,还是决定先贴下公司项目中用到的图片上传的核心方法,

  • 当我点击选择文件按钮上传图像时,什么也没有发生。我试过所有的解决办法,但没有一个有效。我正在运行4.0.3的Galaxy Note(GT-N7000)上进行测试。我的最低SDK版本是版本8。 这是我的代码更多的信息... 谢谢

  • 我是android应用程序开发的新手,试图开发一个web视图应用程序,但似乎无法让文件上传工作。。。请帮忙 这是我的网页视图代码 公共类WebActive扩展了活动{ } 所以我在wv下添加了这个代码。setWebChromeClient//未记录的魔术方法覆盖//br>//如果您尝试在此处放置@override,Eclipse将对您发誓//Android 3.0 public void open

  • 问题内容: 我知道,关于这个主题的话题并非没有,但请耐心等待。我想使用Ajax或等效文件将文件上传到服务器。 我猜我配置ajax函数的方式存在问题,因为在调试模式下,除之外的所有数据均会返回。 我做错了什么吗? 问题答案: 回顾过去,较旧的答案不切实际,不建议使用。暂停整个Javascript以仅上传文件, 您可能会在上传过程中触发其他功能 。 如果您仅将JQuery用于,则我建议使用: Axio