android form表单上传文件

原文地址:http://menuz.iteye.com/blog/1282097

Android程序使用http上传文件 

有时,在网络编程过程中需要向服务器上传文件。Multipart/form-data是上传文件的一种方式。 

Multipart/form-data其实就是浏览器用表单上传文件的方式。最常见的情境是:在写邮件时,向邮件后添加附件,附件通常使用表单添加,也就是用multipart/form-data格式上传到服务器。 

Html代码  

  1. <form action=“/TestWeb/command=UpdatePicture” method=”post” enctype=”multipart/form-data”>

  2. <input type=”file” name=”uploadfile1”/><br>

  3. <input type=”file” name=”uploadfile2”/><br>

  4. <input type=”submit” value=”uploadfile”>

  5. </form>



内容如下: 
Type:multipart/form-data;
boundary=-----------------------------265001916915724
 
-----------------------------265001916915724 
Content-Disposition:
form-data; name="uploadfile1";
filename="web.txt" 
Content-Type:
text/plain 

ChinaNetSNWide  
?­???‘????
?255.255.255.255
?????????èˉ′?????a255??ˉ?…¨?1??’­IP??°???????°±??ˉ?”¨??¥???DHCP???
   
?????¨é?£é??è????–IP??°?????? 
é??è?¤??‘?…30.0.0.0
??3?????o 

-----------------------------265001916915724 
Content-Disposition:
form-data; name="uploadfile2";
filename="20080116064637581.jpg" 
Content-Type:
image/jpeg 

???à 

-----------------------------265001916915724— 

注意点一: 
     
Header 下面boundary 有27个
-(横杆) 
      POST Data
下面传输每个文件的开头是有29个

注意点二: 
     
观察POST
Data可以发现从第一个-----------------------------265001916915724 
     
到第二个-----------------------------265001916915724之间为一个txt文件的相关 
     
信息。 
上面form提交的servlet不用实现,只是解析了http协议,为下面模拟铺垫。 

下面实现android客户端上传图片到服务端的servlet 
android客户端代码

Java代码  

  1. public void upload() {

  2. Log.d(TAG, "upload begin");

  3. HttpURLConnection connection = null;

  4. DataOutputStream dos = null;

  5. FileInputStream fin = null;
  6. String boundary = "---------------------------265001916915724";

  7. // 真机调试的话,这里url需要改成电脑ip

  8. // 模拟机用10.0.0.2,127.0.0.1被tomcat占用了

  9. String urlServer = "http://10.0.0.2:8080/TestWeb/command=UpdatePicture";

  10. String lineEnd = "\r\n";

  11. String pathOfPicture = "/sdcard/aaa.jpg";

  12. int bytesAvailable, bufferSize, bytesRead;

  13. int maxBufferSize = 1*1024*512;

  14. byte[] buffer = null;
  15. try {

  16. Log.d(TAG, "try");

  17. URL url = new URL(urlServer);

  18. connection = (HttpURLConnection) url.openConnection();
  19. // 允许向url流中读写数据

  20. connection.setDoInput(true);

  21. connection.setDoOutput(true);

  22. connection.setUseCaches(true);
  23. // 启动post方法

  24. connection.setRequestMethod("POST");
  25. // 设置请求头内容

  26. connection.setRequestProperty("connection", "Keep-Alive");

  27. connection.setRequestProperty("Content-Type", "text/plain");
  28. // 伪造请求头

  29. connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
  30. // 开始伪造POST Data里面的数据

  31. dos = new DataOutputStream(connection.getOutputStream());

  32. fin = new FileInputStream(pathOfPicture);
  33. Log.d(TAG, "开始上传images");

  34. //--------------------开始伪造上传images.jpg的信息-----------------------------------

  35. String fileMeta = "--" + boundary + lineEnd +

  36. "Content-Disposition: form-data; name=\"uploadedPicture\"; filename=\"" + pathOfPicture + "\"" + lineEnd +

  37. "Content-Type: image/jpeg" + lineEnd + lineEnd;

  38. // 向流中写入fileMeta

  39. dos.write(fileMeta.getBytes());
  40. // 取得本地图片的字节流,向url流中写入图片字节流

  41. bytesAvailable = fin.available();

  42. bufferSize = Math.min(bytesAvailable, maxBufferSize);

  43. buffer = new byte[bufferSize];
  44. bytesRead = fin.read(buffer, 0, bufferSize);

  45. while(bytesRead > 0) {

  46. dos.write(buffer, 0, bufferSize);

  47. bytesAvailable = fin.available();

  48. bufferSize = Math.min(bytesAvailable, maxBufferSize);

  49. bytesRead = fin.read(buffer, 0, bufferSize);

  50. }

  51. dos.writeBytes(lineEnd+lineEnd);

  52. //--------------------伪造images.jpg信息结束-----------------------------------

  53. Log.d(TAG, "结束上传");
  54. // POST Data结束

  55. dos.writeBytes("--" + boundary + "--");
  56. // Server端返回的信息

  57. System.out.println("" + connection.getResponseCode());

  58. System.out.println("" + connection.getResponseMessage());
  59. if (dos != null) {

  60. dos.flush();

  61. dos.close();

  62. }

  63. Log.d(TAG, "upload success-----------------------------------------");

  64. } catch (Exception e) {

  65. e.printStackTrace();

  66. Log.d(TAG, "upload fail");

  67. }

  68. }

服务端servlet

Java代码  

    1. import java.io.File;

    2. import java.io.IOException;

    3. import java.util.List;
    4. import javax.servlet.ServletException;

    5. import javax.servlet.annotation.WebServlet;

    6. import javax.servlet.http.HttpServlet;

    7. import javax.servlet.http.HttpServletRequest;

    8. import javax.servlet.http.HttpServletResponse;
    9. // 利用该组件进行接收客户端上传的文件

    10. // 需要自己加载commons-fileupload-1.2.2.jar和commons-io-2.1.jar

    11. import org.apache.commons.fileupload.FileItem;

    12. import org.apache.commons.fileupload.disk.DiskFileItemFactory;

    13. import org.apache.commons.fileupload.servlet.ServletFileUpload;
    14. /**

    15. * Servlet implementation class ReceivePictureFromAndroid

    16. */

    17. @WebServlet("/command=UpdatePicture")

    18. public class ReceivePictureFromAndroid extends HttpServlet {

    19. private static final long serialVersionUID = 1L;
    20. public ReceivePictureFromAndroid() {

    21. super();

    22. }
    23. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    24. }
    25. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    26. try {

    27. DiskFileItemFactory factory = new DiskFileItemFactory();

    28. ServletFileUpload upload = new ServletFileUpload(factory);

    29. List<FileItem> list = upload.parseRequest(request);

    30. System.out.println(list + " list " + list.size() );

    31. for(FileItem item : list) {

    32. String paramName = item.getFieldName();

    33. System.out.println(paramName);

    34. String paramValue = item.getString();

    35. System.out.println(paramValue);

    36. if(item.isFormField() == false) {

    37. File f = new File("f:\\img.jpg");

    38. item.write(f);

    39. System.out.println("write filt success");

    40. }

    41. }

    42. } catch (Exception e) {

    43. e.printStackTrace();

    44. }

    45. }
    46. }

android form表单上传文件

时间: 2024-08-05 07:06:05

android form表单上传文件的相关文章

使用form表单上传文件

在使用form表单上传文件时候,input[type='file']是必然会用的,其中有一些小坑需要避免. 1.form的 enctype="multipart/form-data" 已经是个老生常谈的问题了,相信都能注意到,就不多说了. 2.上传下载的请求是不能用ajax提交返回json的. 3.当使用input[type='file'] 的onChange事件来触发文件上传的时候要注意当上传成功时清空input的时候,不能简单的使用$("input").val(

关于form表单上传文件的问题

最近在学习php,刚好学到利用表单上传文件这一知识.在学习的过程中,出现了这样几个问题,我是小白,还请高手指点. 大家都知道在上传文件时,我们要设置表单的MIME编码.默认情况,enctype的编码格:application/x-www-form-urlencoded,不能用于文件上传, 只有使用了multipart/form-data,才能完整的传递文件数据,进行下面的操作.但是我在接下来的操作中,遇到了这样的问题. <?php   if (isset($_POST['submit']) &

form表单上传文件

注意form表单上传文件的时候,要加上   enctype这个属性 原文地址:https://www.cnblogs.com/xiaoxiaoyao/p/8541923.html

django 基于form表单上传文件和基于ajax上传文件

一.基于form表单上传文件 1.html里是有一个input type="file" 和 'submit'的标签 2.vies.py def fileupload(request): if request.method == 'POST': print(request.POST) print(request.FILES) # from django.core.files.uploadedfile import InMemoryUploadedFile print(type(reque

form表单上传文件使用multipart请求处理

在开发Web应用程序时比较常见的功能之一,就是允许用户利用multipart请求将本地文件上传到服务器,而这正是Grails的坚固基石——spring MVC其中的一个优势.Spring通过对Servlet API的HttpServletRequest接口进行扩展,使其能够很好地处理文件上传.扩展后的接口名为org.springframework.web.multipart.MultipartHttpServletRequest,其内容如清单7-31所示. 清单7-31  org.springf

PHP 后台程序配置config文件,及form表单上传文件

一,配置config文件 1获取config.php文件数组, 2获取form 表单提交的值 3保存更新config.php文件,代码如下: 1 $color=$_POST['color']; 2 $backtype=$_POST['backtype']; 3 4 $settings=include(dirname(__DIR__).'/config.php'); 5 6 $settings['themescolor']=(int)$color; 7 $settings['themesbackg

ajax上传文件 基于jquery form表单上传文件

<script src="/static/js/jquery.js"></script><script> $("#reg-btn").click(function () { // 1. 取到用户填写的数据 var form_data_obj = new FormData(); form_data_obj.append('username',$('#id_username').val()); form_data_obj.append

nodejs-http 对form表单上传文件数据的解析过程

前几天碰到了一个需求,允许接收前端用户上传的文件. 当时为了解决问题索性就上github搜了下,找了一个基于nodejs的开发插件. 后来功能实现后觉得意犹未尽,于是自己想试试去写一个类似功能的插件,方便以后拓展,然后就这么开始了. 先来说说应用层的http,数据从前端是怎么被它包装然后传到服务器的. 我们可以在浏览器中查看我们发一个请求的时候包什么格式的,例如我们访问百度时得到的请求包内容: Remote Address:180.97.33.107:443 Request URL:https:

C# 模拟Form表单上传文件方法

public static string UploadFile(string url, HttpPostedFileBase file,string FieldName) { Stream fs = file.InputStream; if (!fs.CanRead) { return ""; } byte[] buffer = new byte[fs.Length]; fs.Read(buffer, 0, (int)fs.Length); fs.Close(); string bou