【问题标题】:Uploading images to a PHP server from Android从 Android 将图像上传到 PHP 服务器
【发布时间】:2011-02-02 10:10:45
【问题描述】:

我需要将图像上传到远程 PHP 服务器,该服务器需要 HTTPPOST 中的以下参数:

*$_POST['title']*
*$_POST['caption']*
*$_FILES['fileatt']*

大多数互联网搜索建议:

下载以下类并尝试使用 MultiPartEntity 发送请求:

apache-mime4j-0.5.jar
httpclient-4.0-beta2.jar
httpcore-4.0-beta3.jar
httpmime-4.0-beta2.jar

使用 URLconnection 并自己处理多部分数据。

顺便说一句,我热衷于使用 HttpClient 类而不是 java.net(或者是 android.net)类。最终,我从 Android 源代码中下载了 Multipart 类,并在我的项目中使用它们。

虽然这可以通过上述任何一种方法来完成,但我想确定这些方法是否是实现上述目标的唯一方法。我浏览了文档并找到了一个 FileEntity 类,但我无法让它工作。

在 Android 应用程序中完成此操作的正确方法是什么?

谢谢。

【问题讨论】:

  • 为了便于实施,请参阅我的post

标签: android file-upload httpclient


【解决方案1】:

也许官方 Android 组上的 post 会有所帮助。这家伙正在使用 mime4j。

另一个有用的资源可能是 Pro Android 书中的this example

【讨论】:

    【解决方案2】:

    Android 源代码似乎带有一个内部多部分帮助程序库。 See this post。快速浏览一下,它比大量公共 API(咳嗽、SoundPool、咳嗽咳嗽)有更好的文档记录,因此它应该是一个很好的起点,或者仅使用嵌入式解决方案也可以。

    【讨论】:

    • 是的,我也看到了那个帖子,并设法下载了“multipart”包并通过更改包名称来使用它。感谢您的回复。
    • 您也可以查看官方的 Apache HTTPMime 项目:hc.apache.org/httpcomponents-client/httpmime/apidocs/index.html 它基于 Mime4j,我没有亲自使用过,但它似乎旨在在 HTTPClient 4 上进行 multipart;它可能适用于 Android HTTPClient,但我不能肯定。
    【解决方案3】:

    我这样做是为了与图像托管服务器(也在 php 中实现)进行交互,该服务器需要参数,就好像它们是从 html 页面发布的一样。

    我构建了一个 List<NameValuePair> 我的键和值,如下所示:

        List<NameValuePair> params = new ArrayList<NameValuePair>(2);
        params.add(new BasicNameValuePair(key1, value1));
        params.add(new BasicNameValuePair(key2, value2));
    

    然后我将它传递给设置我的 HttpPost 请求的 HttpEntity 属性的 http 助手类。这是直接来自我的帮助类的方法:

    public static HttpResponse Post(String url, List<NameValuePair> params, Context context)
    {
        HttpResponse response = null;
        try
        {
            HttpPost request = new HttpPost();
            request.setURI(new URI(url));
            if(params != null)
                request.setEntity(new UrlEncodedFormEntity(params));
            HttpClient client = ((ApplicationEx)context.getApplicationContext()).getHttpClient();
            response = client.execute(request);
        }
        catch(Exception ex)
        {
            // log, etc
        }
        return response;
    }
    

    【讨论】:

    • 你究竟创建了什么类型的实体对象来封装一个文件对象?
    • 嗯...如果我拥有合同的双方,我不会使用 $_FILES 数组...我会发送一个常规的键/值对作为 post 参数,其中值是一个字节流。如果我只拥有客户端并且服务器严格需要 $_FILES 的东西,我会用一个简单的表单制作一个测试 html 页面(文件上传),用 fiddler 跟踪它,并手动构建 post 有效负载以反映标头和有效负载。浏览器创建一个“边界”字符串,通过标头告诉服务器边界是什么,然后将字节流包含在该边界中。你也可以这样做。
    • 这正是我所说的:使用 URLconnection 并自己处理多部分数据。我真正想要的是一个像 MultipartEntity 这样的类来为我处理所有这些。不幸的是,这个类没有导入Android。然而,文档中包含了一个 FileEntity 类,我想知道如何使用它。
    猜你喜欢
    • 2015-03-29
    • 2011-10-15
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    相关资源
    最近更新 更多