作为我的
Android应用程序的一部分,我想上传位图以进行远程存储.我有简单的HTTP GET和POST通信工作完美,但是关于如何做多部分POST的文档似乎与独角兽一样罕见.
此外,我想直接从内存传输图像,而不是使用文件.在下面的示例代码中,我从一个文件中获取一个字节数组,以便稍后使用HttpClient和MultipartEntity.
File input = new File("climb.jpg"); byte[] data = new byte[(int)input.length()]; FileInputStream fis = new FileInputStream(input); fis.read(data); ByteArrayPartSource baps = new ByteArrayPartSource(input.getName(),data);
这一切似乎对我来说很清楚,除了我不能为我的生活找到在哪里得到这个ByteArrayPartSource.我已经链接到httpclient和httpmime JAR文件,但没有骰子.我听说HttpClient 3.x和4.x之间的包结构发生了很大变化.
有人在Android中使用这个ByteArrayPartSource,他们是如何导入的?
在文档挖掘和冲刷互联网后,我想出了符合我需求的东西.要制作一个多部分请求,如表单POST,以下代码为我做了一个窍门:
File input = new File("climb.jpg"); DefaultHttpClient client = new DefaultHttpClient(); HttpPost post = new HttpPost("http://localhost:3000/routes"); MultipartEntity multi = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); String line; multi.addPart("name",new StringBody("test")); multi.addPart("grade",new StringBody("test")); multi.addPart("quality",new StringBody("test")); multi.addPart("latitude",new StringBody("40.74")); multi.addPart("longitude",new StringBody("40.74")); multi.addPart("photo",new FileBody(input)); post.setEntity(multi); HttpResponse resp = client.execute(post);
HTTPMultipartMode.BROWSER_COMPATIBLE位非常重要.感谢Radomir’s blog在这一个.
解决方法
尝试这个:
HttpClient httpClient = new DefaultHttpClient() ; HttpPost httpPost = new HttpPost("http://example.com"); MultipartEntity entity = new MultipartEntity(); entity.addPart("file",new FileBody(file)); httpPost.setEntity(entity ); HttpResponse response = null; try { response = httpClient.execute(httpPost); } catch (ClientProtocolException e) { Log.e("ClientProtocolException : "+e,e.getMessage()); } catch (IOException e) { Log.e("IOException : "+e,e.getMessage()); }