2012-12-03 44 views
2

我想从我的Android应用程序发送的压缩文件到我们的服务器,我不断收到一个411长度所需错误发送文件与参数一起。如何通过http

这里是我使用这样做的代码。

HttpPost post = new HttpPost("http://www.xyz.org/upload.json"); 
    post.setHeader(C.constants.HTTP_CONTENT_TYPE, "application/octet-stream"); 

    try { 
     FileInputStream fis = new FileInputStream("/data/data/org.myapp.appname/app_content.zip"); 

     InputStreamEntity reqEntity = new InputStreamEntity(fis, -1); 
     post.setEntity(reqEntity); 
     String response = doPost(post); 

     Log.v(tag, "response from server " + response); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 

我在做什么错在这里,我可能也知道如何添加更多参数与这篇文章发送到服务器。

+0

我没有一个明确的答案,但有一件事你做错了,是使用硬编码路径('/数据/数据...')。改为使用FileInputStream fis = openFileInput(“app_content.zip”)。 – Squonk

+0

此外,您可以多次使用'setHeader(String name,String value)'。只要'name'是唯一的,它只需将新标题追加到标题列表的末尾。 – Squonk

+0

@Squonk:我非常肯定Android上的文件路径是正确的。这就是与我的应用程序相关的文件的位置。感谢您关于设置PARAMS作为标题建议,但我不想这样做,因为我们正在尽快改变这种作为可来自全国各地不同的操作系统的设备进行访问,并希望这样做的正确方法的API计划。 :) – achie

回答

1

您应该使用multipart MIME类型,以及零件的​​每个参数和文件。请参阅this old blog post of mine。如你所知,一个HTTP请求(和响应也是)由两部分组成:一个头部和一个主体(也叫实体)。在标题中指定Content-Type,以便服务器脚本知道如何解释以下字节(您也可以在同一行中指定文本数据的编码)。

的头之后,客户端发送一个空行和一个可选的实体。多部分实体就像是由边界分开的部分的堆栈。这是你想要的HTTP请求应该是什么样子的线:

POST /path/to/script.json HTTP/1.1 
Host: localhost 
Content-Type: multipart/form-data; boundary=a2ksdf0?-- 

a2ksdf0?-- 
Content-Disposition: form-data; name="profile_picture"; filename="me.png" 
Content-Type: image/png 

<content here> 
a2ksdf0?-- 
Content-Disposition: form-data; name="username"; 
Content-Type: text/plain 

Joe Black 

顺便说一句,这是我第一次看到一个名为upload.json上载脚本。你在服务器端使用什么?

+0

哦,这只是一个小的脚本,抓取我发送的文件和参数,让我稍后访问它们。是的.json听起来不正确,但它是一个内部API,它现在完成了工作。并感谢您的回复,我现在正在查看您的帖子。 – achie