公告:CSDN新版首页上线      欢迎关注CSDN产品客服微博     CSDN论坛 第4期专家问答——基于openstac的可扩展云平台开发

Android模拟 HTTP multipart/form-data 请求协议信息实现图片上传

        分类:            手机开发2011-08-30 15:331391人阅读评论(0)收藏举报
androidimagepropertiesstringoutputobject

问题:

Android应用中,当遇到填写用户信息、发表评论等操作,不可避免会遇到“form表单操作”(类似web form操作)上传图片的功能。

在这种情况下,使用Android的HTTPConnection/ ApacheHTTP 通过POST 和GET的方式就实现不了。

解决方法:

Android客户端通过模拟 HTTP multipart/form-data 请求协议信息实现图片上传。

[java] view plaincopyprint?
  1. /**
  2. * 文件名称:UploadImage.java
  3. *
  4. * 版权信息:Apache License, Version 2.0
  5. *
  6. * 功能描述:实现图片文件上传。
  7. *
  8. * 创建日期:2011-5-10
  9. *
  10. * 作者:Bert Lee
  11. */
  12. /*
  13. * 修改历史:
  14. */
  15. publicclass UploadImage {
  16. String multipart_form_data = "multipart/form-data";
  17. String twoHyphens = "--";
  18. String boundary = "****************fD4fH3gL0hK7aI6";    // 数据分隔符
  19. String lineEnd = System.getProperty("line.separator");    // The value is "\r\n" in Windows.
  20. /*
  21. * 上传图片内容,格式请参考HTTP 协议格式。
  22. * 人人网Photos.upload中的”程序调用“http://wiki.dev.renren.com/wiki/Photos.upload#.E7.A8.8B.E5.BA.8F.E8.B0.83.E7.94.A8
  23. * 对其格式解释的非常清晰。
  24. * 格式如下所示:
  25. * --****************fD4fH3hK7aI6
  26. * Content-Disposition: form-data; name="upload_file"; filename="apple.jpg"
  27. * Content-Type: image/jpeg
  28. *
  29. * 这儿是文件的内容,二进制流的形式
  30. */
  31. privatevoid addImageContent(Image[] files, DataOutputStream output) {
  32. for(Image file : files) {
  33. StringBuilder split = new StringBuilder();
  34. split.append(twoHyphens + boundary + lineEnd);
  35. split.append("Content-Disposition: form-data; name=\"" + file.getFormName() + "\"; filename=\"" + file.getFileName() + "\"" + lineEnd);
  36. split.append("Content-Type: " + file.getContentType() + lineEnd);
  37. split.append(lineEnd);
  38. try {
  39. // 发送图片数据
  40. output.writeBytes(split.toString());
  41. output.write(file.getData(), 0, file.getData().length);
  42. output.writeBytes(lineEnd);
  43. } catch (IOException e) {
  44. thrownew RuntimeException(e);
  45. }
  46. }
  47. }
  48. /*
  49. * 构建表单字段内容,格式请参考HTTP 协议格式(用FireBug可以抓取到相关数据)。(以便上传表单相对应的参数值)
  50. * 格式如下所示:
  51. * --****************fD4fH3hK7aI6
  52. * Content-Disposition: form-data; name="action"
  53. * // 一空行,必须有
  54. * upload
  55. */
  56. privatevoid addFormField(Set<Map.Entry<Object,Object>> params, DataOutputStream output) {
  57. StringBuilder sb = new StringBuilder();
  58. for(Map.Entry<Object, Object> param : params) {
  59. sb.append(twoHyphens + boundary + lineEnd);
  60. sb.append("Content-Disposition: form-data; name=\"" + param.getKey() + "\"" + lineEnd);
  61. sb.append(lineEnd);
  62. sb.append(param.getValue() + lineEnd);
  63. }
  64. try {
  65. output.writeBytes(sb.toString());// 发送表单字段数据
  66. } catch (IOException e) {
  67. thrownew RuntimeException(e);
  68. }
  69. }
  70. /**
  71. * 直接通过 HTTP 协议提交数据到服务器,实现表单提交功能。
  72. * @param actionUrl 上传路径
  73. * @param params 请求参数key为参数名,value为参数值
  74. * @param files 上传文件信息
  75. * @return 返回请求结果
  76. */
  77. public String post(String actionUrl, Set<Map.Entry<Object,Object>> params, Image[] files) {
  78. HttpURLConnection conn = null;
  79. DataOutputStream output = null;
  80. BufferedReader input = null;
  81. try {
  82. URL url = new URL(actionUrl);
  83. conn = (HttpURLConnection) url.openConnection();
  84. conn.setConnectTimeout(120000);
  85. conn.setDoInput(true);        // 允许输入
  86. conn.setDoOutput(true);        // 允许输出
  87. conn.setUseCaches(false);    // 不使用Cache
  88. conn.setRequestMethod("POST");
  89. conn.setRequestProperty("Connection", "keep-alive");
  90. conn.setRequestProperty("Content-Type", multipart_form_data + "; boundary=" + boundary);
  91. conn.connect();
  92. output = new DataOutputStream(conn.getOutputStream());
  93. addImageContent(files, output);    // 添加图片内容
  94. addFormField(params, output);    // 添加表单字段内容
  95. output.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);// 数据结束标志
  96. output.flush();
  97. int code = conn.getResponseCode();
  98. if(code != 200) {
  99. thrownew RuntimeException("请求‘" + actionUrl +"’失败!");
  100. }
  101. input = new BufferedReader(new InputStreamReader(conn.getInputStream()));
  102. StringBuilder response = new StringBuilder();
  103. String oneLine;
  104. while((oneLine = input.readLine()) != null) {
  105. response.append(oneLine + lineEnd);
  106. }
  107. return response.toString();
  108. } catch (IOException e) {
  109. thrownew RuntimeException(e);
  110. } finally {
  111. // 统一释放资源
  112. try {
  113. if(output != null) {
  114. output.close();
  115. }
  116. if(input != null) {
  117. input.close();
  118. }
  119. } catch (IOException e) {
  120. thrownew RuntimeException(e);
  121. }
  122. if(conn != null) {
  123. conn.disconnect();
  124. }
  125. }
  126. }
  127. publicstaticvoid main(String[] args) {
  128. try {
  129. String response = "";
  130. BufferedReader in = new BufferedReader(new FileReader("config/actionUrl.properties"));
  131. String actionUrl = in.readLine();
  132. // 读取表单对应的字段名称及其值
  133. Properties formDataParams = new Properties();
  134. formDataParams.load(new FileInputStream(new File("config/formDataParams.properties")));
  135. Set<Map.Entry<Object,Object>> params = formDataParams.entrySet();
  136. // 读取图片所对应的表单字段名称及图片路径
  137. Properties imageParams = new Properties();
  138. imageParams.load(new FileInputStream(new File("config/imageParams.properties")));
  139. Set<Map.Entry<Object,Object>> images = imageParams.entrySet();
  140. Image[] files = new Image[images.size()];
  141. int i = 0;
  142. for(Map.Entry<Object,Object> image : images) {
  143. Image file = new Image(image.getValue().toString(), image.getKey().toString());
  144. files[i++] = file;
  145. }
  146. //            Image file = new Image("images/apple.jpg", "upload_file");
  147. //            Image[] files = new Image[0];
  148. //            files[0] = file;
  149. response = new UploadImage().post(actionUrl, params, files);
  150. System.out.println("返回结果:" + response);
  151. } catch (IOException e) {
  152. e.printStackTrace();
  153. }
  154. }
  155. }

转载于:https://www.cnblogs.com/loushangshaonian/archive/2013/04/19/3030394.html

摘抄 ander图片上传相关推荐

  1. html显示数据库图片django,django将图片上传数据库后在前端显式的方法

    1.使用ImageField先安装pillow模块 pip install pillow 2.在app的models中设置 class Image(models.Model): pic_name=mo ...

  2. yii2框架原生的结合框架使用的图片上传

    首先我们要从model层开始写起,主要是为了创建验证规则,还有图片上传的路径以及图片的命名规则(UploadForm.php) 接下来我们要在控制器层写好业务逻辑,就是什么情况下直接在调用model层 ...

  3. java flex 图片上传_flex上传图片到java服务器

    今天弄flex上传图片到java,现在弄成功,中间也经常一点小波折,现记录一下.重点在java侧的实现. flex侧:文件上载到在url参数中传递的URL.该URL必须是配置为接受上载的服务器脚本.F ...

  4. js表单提交,支持图片上传,包含后端php代码

    微信小程序开发交流qq群   581478349    承接微信小程序开发.扫码加微信. <html><head><meta http-equiv="Conte ...

  5. ckeditor finder php,CKEDITOR CKFINDER的图片上传配置(C#/asp.net/php)

    CKEDITOR+CKFINDER的图片上传配置(C#/asp教程.net/php教程) php keditor的代码全部重写,但里面没有了上传功能,只是一个纯粹的文件在线编辑器,如果需要上传图片,还 ...

  6. 图片上传(加水印、缩略图、远程保存)的简单例子

    图片上传(加水印.缩略图.远程保存)的简单例子(应用于51aspx.com) 该源码下载地址:http://51aspx.com/CV/ImageUpload 今天看到xiongeee发的文章使用使用 ...

  7. 使用summernote实现复制图片即可实现图片上传

    个人资源与分享网站:http://xiaocaoshare.com/ 1.页面结构 <script src="../statics/js/plugins/summernote/summ ...

  8. js实现图片上传本地预览

    演示地址:https://xibushijie.github.io/static/uploadImg.html <!DOCTYPE> <html><head>< ...

  9. SpringBoot 2.0 多图片上传加回显

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 本文来源:http://r6f.cn/crEY 这两天公司 ...

  10. alert()的功能_前端实现简单的图片上传小图预览功能

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8" ...

最新文章

  1. 2017,公司必须换掉的六种人,别心软!
  2. UI设计师必须了解:2015年十大移动端APP设计主流趋势
  3. 播放视频和音频文件java
  4. 该!这个电视频道违规播出非法集资广告 被停播30天
  5. win11找不到开启蓝牙开关,设备管理器也没有蓝牙
  6. 安装Linux无盘工作站
  7. html阻止超链接跳转,009_阻止html标签默认事件的执行,比如阻止超链接默认点击事件的执行...
  8. PowerDesigner 16.5下载安装包
  9. git gitlan 切糕入门
  10. PAT(甲级)1148 Werewolf - Simple Version(枚举)
  11. IoT僵尸网络Miori通过ThinkPHP远程代码执行漏洞进行传播
  12. android 小米8底部有一大片黑色
  13. 分布式数据库如何实现主键全局自增?
  14. PTA 6 循环日程表
  15. 易盾php,PHP接入网易易盾验证码
  16. js 操作字符串,
  17. Android视频编码--H264编码
  18. Linux创建share共享文件夹
  19. 机器视觉丨平行面光源的原理丨打光案例及尺寸图
  20. Android开发必备(干货源码放送大)

热门文章

  1. 软件工程期末考试复习(二)
  2. “云时代架构”经典文章阅读感想十三
  3. linux-推荐两款好用的录屏软件
  4. UVa 714 抄书(贪心+二分)
  5. [转] 背完这444句英语,你的口语绝对不成问题
  6. WHILE (Transact-SQL)
  7. stm32中.bss和.data段是在哪里初始化的
  8. spring security原理图及其解释
  9. 精明管理者选人的N种方式
  10. HGOI 20190816 省常中互测8