使用HttpClient下载图片常用代码,以及下载失败原因
2015-03-26 16:26
627 查看
最近一直在完善云相册项目,寻找各种bug,昨天突然发现,图片上传经常出现错误,错误有可能与网速有关,但是这种错误却是致命的,我们不能保证所有人的网速都很稳定,于是我就仔细看了下代码,发现异常都是在此处response = httpClient.execute(post);执行上传动作的时候出的错。先对代码做一点说明吧,UploaderParam是一个实体类对象,里面存放的是下载信息(包括本地图片地址),别的部分只要懂httpClient应该都能明白的。(修改:唉,好像还是和网速有点关联啊,大家仅参考下代码吧)
代码已经贴出来了,不过仅供参考,真正解决下载失败的其实是包问题,我们都知道,httpclient是封装好的协议,远比使用httpconnection方便很多,但是同时也会有很多问题,我们项目一开始引用的就是httpmime-4.0.1.jar,这个包真的拥有不小的问题,下载时很容易出错。于是我重下了个4.2版本,错误就不再产生了。希望我的这篇文章能帮助你们。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
以上文章是12年写的,现在基本都是4.0系统,不提倡使用HttpClient,google官方也已经不维护了吧,不管从哪个角度来讲HttpConnection才是现在最好的选择。
[代码]java代码:
public String uploadFile(UploaderParam uploaderParam) { Log.d(TAG, "uploadFile ... "); HttpResponse response = null; BufferedReader reader = null; StringBuilder builder = new StringBuilder(); final String fileNameIn = uploaderParam.getFileName(); Log.i(TAG, "upload fileName: "+ fileNameIn); try { String epgUri = assembleEPGUrl(uploaderParam); HttpPost post = new HttpPost(epgUri); Log.i(TAG, "httpPost uri: " + epgUri); //HttpPost post = new HttpPost("http://10.0.64.132:8001/upload?sid=2&skey=23837391433022"); MultipartEntity multipartEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); //读取本地图片,以流的形式 FileInputStream inputStream = new FileInputStream(new File(uploaderParam.getFileName())); //final byte[] data = IOUtils.toByteArray(inputStream); final int length = inputStream.available(); Log.i(TAG, "Length is: " + Integer.toString(length)); InputStreamBody isb = new InputStreamBody(inputStream, "uploaderFile") { @Override public long getContentLength() { return length; } @Override public String getFilename() { return fileNameIn; } }; multipartEntity.addPart("uploaderFile", isb); post.setEntity(multipartEntity); System.out.println(" 悲了个剧啊"+post.getURI()); Log.d("uploadFile", "uploaderParam.getFileName() is : " + uploaderParam.getFileName()); Thread.sleep(1000); try{ response = httpClient.execute(post); }catch(Exception e){ System.out.println("try again!!"); Thread.sleep(1000); try{ response = httpClient.execute(post); }catch(Exception e1){ System.out.println("again 失败"); return null; } } Log.d(TAG, "uploadFile .......................................................... "); Log.d(TAG, "1" + response.getStatusLine().getStatusCode()); Log.d(TAG, "2" + response.getStatusLine().getReasonPhrase()); if(response == null){ System.out.println("response is null"); } if(response.getStatusLine().getStatusCode() != HttpStatus.SC_OK){ System.out.println("response.getStatusLine().getStatusCode() != HttpStatus.SC_OK"); } //by LLH if(response != null && response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { Log.d(TAG, "uploadFile success .......................................................... "); HttpEntity entity = response.getEntity(); reader = new BufferedReader(new InputStreamReader(entity.getContent())); String line = null; while((line = reader.readLine()) != null) { builder.append(line); } reader.close(); } else { Log.e(TAG, "execute() return null"); } //EntityUtils.toString(response.getEntity()); Log.d(TAG, "uploadFile result is : " + builder.toString()); } catch (Throwable e) { e.printStackTrace(); } return builder.toString(); }
代码已经贴出来了,不过仅供参考,真正解决下载失败的其实是包问题,我们都知道,httpclient是封装好的协议,远比使用httpconnection方便很多,但是同时也会有很多问题,我们项目一开始引用的就是httpmime-4.0.1.jar,这个包真的拥有不小的问题,下载时很容易出错。于是我重下了个4.2版本,错误就不再产生了。希望我的这篇文章能帮助你们。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
以上文章是12年写的,现在基本都是4.0系统,不提倡使用HttpClient,google官方也已经不维护了吧,不管从哪个角度来讲HttpConnection才是现在最好的选择。
相关文章推荐
- Control Study->AdRotator广告控件显示自定义配置文件中广告以及与DataGrid控件结合使用显示图片(示例代码下载)
- Control Study->AdRotator广告控件显示自定义配置文件中广告以及与DataGrid控件结合使用显示图片(示例代码下载)
- 使用httpclient下载图片时,url中含有中文字符,导致下载失败的解决方法
- Control Study->AdRotator广告控件显示自定义配置文件中广告以及与DataGrid控件结合使用显示图片(示例代码下载)
- Control Study->AdRotator广告控件显示自定义配置文件中广告以及与DataGrid控件结合使用显示图片(示例代码下载)
- 演示事件(Event)怎样使用以及怎样为用户控件添加一个事件(示例代码下载)
- 使用jquery与图片美化checkbox和radio控件的代码(打包下载)
- 使用PHP下载CSS文件中的图片的代码
- windows下,使用SVN下载代码,以及目录结构介绍
- 使用ListView和AsyncTask、fastjson解析Json以及适配器BaseAdapter来实现下载网络的图片以及文字并显示出来
- 演示事件(Event)怎样使用以及怎样为用户控件添加一个事件(示例代码下载)
- 使用ThinkPHP自带的Http类下载远程图片到本地的实现代码
- 使用PHP下载CSS文件中的图片的代码
- asp.net源代码下载网站、C#/VB代码转换网站以及其他常用网站
- Java:使用HttpClient进行POST和GET请求以及文件上传和下载
- Android使用HttpClient下载图片
- 简单明了地解释JMS , 相关概念 ,以及JMS的实例代码下载 ,传统使用方式(非Spring框架下的集成)
- 分享25个网站常用基于jquery焦点图图片展示代码下载
- 使用PHP下载CSS文件中的图片的代码
- 使用PHP下载CSS文件中的图片的代码