从Android上传图片到PHP服务器

6
我需要将一张图片上传到一个远程的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应用程序中正确的完成此操作的方法是什么?

谢谢。


请查看我的帖子以获得简单的实现方法。 - Vikas
3个回答

5

Android源代码似乎带有一个内部的多部分帮助库。 查看这篇文章。从快速浏览来看,它的文档比许多公共API(咳咳,SoundPool,咳咳)更好,因此这应该是一个很好的起点,或者可能是一个可以直接使用的解决方案。


是的,我也看到了那个帖子,成功下载了“multipart”包并通过更改包名来使用它。谢谢您的回复。 - Samuh
1
你也可以查看官方的Apache HTTPMime项目:http://hc.apache.org/httpcomponents-client/httpmime/apidocs/index.html。它基于Mime4j,我个人没有使用过它,但它似乎旨在在HTTPClient 4上执行多部分操作;它可能与Android HTTPClient一起使用,但我不能确定。 - Yoni Samlan

4
也许这篇官方Android组的帖子可以提供帮助。这个人正在使用mime4j。
另一个有用的资源可能是Pro Android书中的这个例子

3

我会使用类似以下代码的方式与一个图像托管服务器进行交互(该服务器也是用php实现的),它期望参数就像它们是从html页面提交的一样。

我会构建一个List<NameValuePair>,其中包含我的键和值:

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

然后我将它传递给我的http辅助类,该类设置我的HttpPost请求的HttpEntity属性。以下是我的辅助类中直接使用的方法:

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;
}

你需要创建哪种类型的实体对象来封装一个文件对象? - Samuh
如果我拥有合同的双方,我不会使用 $_FILES 数组...我会发送一个常规的键/值对作为 post 参数,其中值是字节流。如果我只拥有客户端,而服务器严格要求使用 $_FILES,我会制作一个简单的表单测试页面(文件上传),使用 fiddler 进行跟踪,并手动构建 post 负载以反映头和负载。浏览器创建一个“边界”字符串,通过标头告诉服务器边界是什么,然后将字节流包含在此边界中。你也可以这样做。 - Rich
这正是我所说的:使用URLConnection并自己处理多部分数据。 我真正想要的是像MultipartEntity这样的类,可以为我处理所有这些。不幸的是,这个类没有被导入到Android中。然而,文档列出了一个FileEntity类,我想知道如何使用它。 - Samuh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接