2010-03-30 91 views
6

一个PHP的服务器我要上传图片到其预计HTTPPOST以下参数远程PHP服务器:上传图片从Android

*$_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 

OR

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

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

虽然这可以通过任何上述方法做,我想确保,如果这些都实现上述目标的唯一途径。我浏览了文档,发现一个FileEntity类,但我无法让它工作。

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

谢谢。

+0

为便于执行看到我的[发布](http://vikaskanani.wordpress.com/2011/01/11/android-upload-image-or-file-using-http-post-multi-part/)。 – Vikas 2011-01-18 03:56:06

回答

5

Android源似乎带有内部多部分帮助程序库。 See this post。乍看之下,它比许多公共API(咳嗽咳嗽,SoundPool,咳嗽咳嗽)更好地记录下来,所以它应该是一个很好的开始,或者可以很好地使用插入式解决方案。

+0

是的,我也看到了该线程,并设法下载“multipart”包,并通过更改包名来使用它。感谢您的回复。 – Samuh 2010-04-03 15:39:39

+1

你也可以看看官方的Apache HTTPMime项目:http://hc.apache.org/httpcomponents-client/httpmime/apidocs/index.html它基于Mime4j,我没有亲自使用它,但它似乎目的是在HTTPClient 4上做多部分;它可能会与Android HTTPClient一起工作,但我无法确定。 – 2010-04-03 17:07:08

3

我也正是以与预期参数,好像他们是从HTML页发布的图像托管服务器(在PHP中也实现)交互。

我建立了我的钥匙的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; 
} 
+0

你准确创建什么类型的实体对象来封装文件对象? – Samuh 2010-03-30 16:56:31

+0

那么......如果我拥有合同的双方,我不会使用$ _FILES数组...我会发送一个常规的键/值对作为一个后置参数,其中的值是一个字节流。如果我只拥有客户端和服务器严格要求$ _FILES的东西,我会用一个简单的表单做一个测试html页面(文件上传),用提琴手跟踪它,然后手动构建post payload以反映标题和有效载荷。浏览器创建一个“边界”字符串,通过头部告诉服务器边界是什么,然后将字节流封装在这个边界中。你也可以做到的。 – Rich 2010-03-30 17:31:13

+0

这正是我说的意思:使用URLconnection并自己处理多部分数据。 我真正想要的是像MultipartEntity这样的类来处理所有这些对我来说。不幸的是,这个类没有导入Android。然而,这个文档引入了一个FileEntity类,我想知道如何使用它。 – Samuh 2010-04-01 05:41:41

4

也许这post在官方Android组帮助。这家伙正在使用mime4j。

另一个有用的资源可以是在临Android的书this example