`
dyg001
  • 浏览: 27662 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

android http上传文件

阅读更多
在Android的客户端编程中(特别是SNS 类型的客户端),经常需要实现注册功能Activity,要用户输入用户名,密码,邮箱,照片后注册。但这时就有一个问题,在HTML中用form表单就能实现如上的注册表单,需要的信息会自动封装为完整的HTTP协议,但在Android中如何把这些参数和需要上传的文件封装为HTTP协议呢?

我们可以先做个试验,看一下form表单到底封装了什么样的信息。

第一步:编写一个Servlet,把接收到的HTTP信息保存在一个文件中,代码如下:

1.    public void doPost(HttpServletRequest request, HttpServletResponse response)
2.
3.           throws ServletException, IOException {
4.
5.
6.
7.       //获取输入流,是HTTP协议中的实体内容
8.
9.       ServletInputStream  sis=request.getInputStream();
10.
11.    
12.
13.       //缓冲区
14.
15.       byte buffer[]=new byte[1024];
16.
17.     
18.
19.       FileOutputStream fos=new FileOutputStream("d:\\file.log");
20.
21.     
22.
23.       int len=sis.read(buffer, 0, 1024);
24.
25.     
26.
27.       //把流里的信息循环读入到file.log文件中
28.
29.       while( len!=-1 )
30.
31.       {
32.
33.           fos.write(buffer, 0, len);
34.
35.           len=sis.readLine(buffer, 0, 1024);
36.
37.       }
38.
39.     
40.
41.       fos.close();
42.
43.       sis.close();
44.
45.     
46.
47.    }
48.
49.
第二步:实现如下一个表单页面, 详细的代码如下:

1.<form action="servlet/ReceiveFile" method="post" enctype="multipart/form-data">
2.
3.    第一个参数<input type="text" name="name1"/> <br/>
4.
5.    第二个参数<input type="text" name="name2"/> <br/>
6.
7.    第一个上传的文件<input type="file" name="file1"/> <br/>
8.
9.    第二个上传的文件<input type="file" name="file2"/> <br/>
10.
11.    <input type="submit" value="提交">
12.
13.</form>
注意了,由于要上传附件,所以一定要设置enctype为multipart/form-data,才可以实现附件的上传。

第三步:填写完信息后按“提交”按钮后,在D盘下查找file.log文件用记事本打开,数据如下:

—————————–7d92221b604bc

Content-Disposition: form-data; name=”name1″

hello

—————————–7d92221b604bc

Content-Disposition: form-data; name=”name2″

world

—————————–7d92221b604bc

Content-Disposition: form-data; name=”file1″; filename=”C:\2.GIF”

Content-Type: image/gif

GIF89a

      €   € €€   €€ € €€€€€览?                                                                                     3  f       3  33 3f 3 3 3 f  f3 ff f f f   ? 檉 櫃 櫶 ?   ? 蘤 虣 烫 ?   3 f   3  3 33 f3 ? ? 33 33333f33?3?33f 3f33ff3f?f?f3 3?3檉3櫃3櫶3?3 3?3蘤3虣3烫3?3 333f3??f  f 3f ff 檉 蘤 f3 f33f3ff3檉3蘤3ff ff3fffff檉f蘤ff f?f檉f櫃f櫶f?f f?f蘤f虣f烫f?f f3fff檉蘤   3 f 櫃 虣 ? ?3?f?櫃3虣3檉 檉3檉f檉櫃f虣f櫃 櫃3櫃f櫃櫃櫶櫃櫶 櫶3櫶f櫶櫃烫櫶? ?3?f?櫃虣   3 f 櫶 烫 ? ?3?f?櫶3烫3蘤 蘤3蘤f蘤櫶f烫f虣 虣3虣f虣櫶櫶虣烫 烫3烫f烫櫶烫烫? ?3?f?櫶烫   3 f ? ? 3 333f3?3?3f f3fff?f?f ?檉櫃櫶??蘤虣烫? 3f??!?   ,  

  e   ??羵Q鸚M!C囑lH馉脝远5荑p釩?3R?R愣?MV39V5?谈re琷?试   3??qn?薵Q燚c?獖i郸EW艗赥戟j ;

—————————–7d92221b604bc

Content-Disposition: form-data; name=”file2″; filename=”C:\2.txt”

Content-Type: text/plain

hello everyone!!!

—————————–7d92221b604bc–

       从表单源码可知,表单上传的数据有4个:参数name1和name2,文件file1和file2

首先从file.log观察两个参数name1和name2的情况。这时候使用UltraEdit打开file.log(因为有些字符在记事本里显示不出来,所以要用16进制编辑器)

       结合16进制数据和记事本显示的数据可知上传参数部分的格式规律:

1.       第一行是“—————————–7d92221b604bc”作为分隔符,然后是“\r\n”(即16进制编辑器显示的0D 0A)回车换行符。

2.       第二行

(1)       首先是HTTP中的扩展头部分“Content-Disposition: form-data;”,表示上传的是表单数据。

(2)       “name=”name1″”参数的名称。

(3)       “\r\n”(即16进制编辑器显示的0D 0A)回车换行符。

3.       第三行:“\r\n”(即16进制编辑器显示的0D 0A)回车换行符。

4.       第四行:参数的值,最后是“\r\n”(即16进制编辑器显示的0D 0A)回车换行符。

由观察可得,表单上传的每个参数都是按照以上1—4的格式构造HTTP协议中的参数部分。

结合16进制数据和记事本显示的数据可知上传文件部分的格式规律:

1.       第一行是“—————————–7d92221b604bc”作为分隔符,然后是“\r\n”(即16进制编辑器显示的0D 0A)回车换行符。

2.       第二行:

a)         首先是HTTP中的扩展头部分“Content-Disposition: form-data;”,表示上传的是表单数据。

b)        “name=”file2″;”参数的名称。

c)        “filename=”C:\2.txt””参数的值。

d)        “\r\n”(即16进制编辑器显示的0D 0A)回车换行符。

3.       第三行:HTTP中的实体头部分“Content-Type: text/plain”:表示所接收到得实体内容的文件格式。计算机的应用中有多种多种通用的文件格式,人们为每种通用格式都定义了一个名称,称为MIME,MIME的英文全称是”Multipurpose Internet Mail Extensions” (多功能Internet 邮件扩充服务)

4.       第四行:“\r\n”(即16进制编辑器显示的0D 0A)回车换行符。

5.       第五行开始:上传的内容的二进制数。

6.       最后是结束标志“—————————–7d92221b604bc–”,注意:这个结束标志和分隔符的区别是最后多了“–”部分。

但现在还有一个问题,就是分隔符“—————————–7d92221b604bc”是怎么确定的呢?是不是一定要“7d92221b604bc”这串数字?

        我们以前的分析只是观察了HTTP请求的实体部分,可以借用工具观察完整的HTTP请求看一看有没有什么线索?

  在IE下用HttpWatch,在Firefox下用Httpfox这个插件,可以实现网页数据的抓包,从图4可看出,原来在Content-Type部分指定了分隔符所用的字符串。


根据以上总结的注册表单中的参数传递和文件上传的规律,我们可以能写出Android中实现一个用户注册功能(包括个人信息填写和上传图片部分)的工具类,

首先,要有一个javaBean类FormFile封装文件的信息:

1.public class FormFile {
2. /* 上传文件的数据 */
3. private byte[] data;
4. /* 文件名称 */
5. private String filname;
6. /* 表单字段名称*/
7. private String formname;
8. /* 内容类型 */
9. private String contentType = "application/octet-stream"; //需要查阅相关的资料
10.
11. public FormFile(String filname, byte[] data, String formname, String contentType) {
12.  this.data = data;
13.  this.filname = filname;
14.  this.formname = formname;
15.  if(contentType!=null) this.contentType = contentType;
16. }
17.
18. public byte[] getData() {
19.  return data;
20. }
21.
22. public void setData(byte[] data) {
23.  this.data = data;
24. }
25.
26. public String getFilname() {
27.  return filname;
28. }
29.
30. public void setFilname(String filname) {
31.  this.filname = filname;
32. }
33.
34. public String getFormname() {
35.  return formname;
36. }
37.
38. public void setFormname(String formname) {
39.  this.formname = formname;
40. }
41.
42. public String getContentType() {
43.  return contentType;
44. }
45.
46. public void setContentType(String contentType) {
47.  this.contentType = contentType;
48. }
49.
50.}
51.

实现文件上传的代码如下:

/**
* 直接通过HTTP协议提交数据到服务器,实现表单提交功能
* @param actionUrl 上传路径
* @param params 请求参数 key为参数名,value为参数值
* @param file 上传文件
*/
public static String post(String actionUrl, Map<String, String> params, FormFile[] files) { 
    try {            
        String BOUNDARY = “———7d4a6d158c9″; //数据分隔线 
        String MULTIPART_FORM_DATA = “multipart/form-data”; 
         
        URL url = new URL(actionUrl); 
        HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
        conn.setDoInput(true);//允许输入 
        conn.setDoOutput(true);//允许输出 
        conn.setUseCaches(false);//不使用Cache 
        conn.setRequestMethod(”POST”);           
        conn.setRequestProperty(”Connection”, “Keep-Alive”); 
        conn.setRequestProperty(”Charset”, “UTF-8″); 
        conn.setRequestProperty(”Content-Type”, MULTIPART_FORM_DATA + “; boundary=” + BOUNDARY); 

        StringBuilder sb = new StringBuilder(); 
         
        //上传的表单参数部分,格式请参考文章 
        for (Map.Entry<String, String> entry : params.entrySet()) {//构建表单字段内容 
            sb.append(”–”); 
            sb.append(BOUNDARY); 
            sb.append(”\r\n”); 
            sb.append(”Content-Disposition: form-data; name=\”"+ entry.getKey() + “\”\r\n\r\n”); 
            sb.append(entry.getValue()); 
            sb.append(”\r\n”); 
        } 
        DataOutputStream outStream = new DataOutputStream(conn.getOutputStream()); 
        outStream.write(sb.toString().getBytes());//发送表单字段数据 
        
        //上传的文件部分,格式请参考文章 
        for(FormFile file : files){ 
            StringBuilder split = new StringBuilder(); 
            split.append(”–”); 
            split.append(BOUNDARY); 
            split.append(”\r\n”); 
            split.append(”Content-Disposition: form-data;name=\”"+ file.getFormname()+”\”;filename=\”"+ file.getFilname() + “\”\r\n”); 
            split.append(”Content-Type: “+ file.getContentType()+”\r\n\r\n”); 
            outStream.write(split.toString().getBytes()); 
            outStream.write(file.getData(), 0, file.getData().length); 
            outStream.write(”\r\n”.getBytes()); 
        } 
        byte[] end_data = (”–” + BOUNDARY + “–\r\n”).getBytes();//数据结束标志          
        outStream.write(end_data); 
        outStream.flush(); 
        int cah = conn.getResponseCode(); 
        if (cah != 200) throw new RuntimeException(”请求url失败”); 
        InputStream is = conn.getInputStream(); 
        int ch; 
        StringBuilder b = new StringBuilder(); 
        while( (ch = is.read()) != -1 ){ 
            b.append((char)ch); 
        } 
        outStream.close(); 
        conn.disconnect(); 
        return b.toString(); 
    } catch (Exception e) { 
        throw new RuntimeException(e); 
    } 




本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhjp4295216/archive/2010/04/27/5534563.aspx
分享到:
评论
1 楼 zgycsmb 2011-12-15  

你好,android中上传图片到服务器中的功能,有例子吗,求发一份给我
350038760@qq.com
多谢

相关推荐

    android 文件上传含进度条

    "android 文件上传含进度条"这个标题恰好揭示了我们要实现的功能:在Android应用中,既要能上传文件,又要能在上传过程中显示进度条,以提升用户体验。 首先,我们需要理解Android的文件操作机制。Android提供了...

    Android端上传文件的jar包

    而“Android端上传文件的jar包”则可能是一个包含了实现此类功能的预编译Java类库,方便开发者快速集成到自己的项目中。 这个jar包可能包含以下关键知识点: 1. **网络请求库**:上传文件通常需要一个网络请求库来...

    android文件上传控件

    3. 使用HTTP客户端发起POST请求,附带上传文件的数据。 4. 在请求过程中,更新界面的上传进度条或提示信息。 5. 服务器端接收到请求,解析文件数据并保存。 6. 客户端接收到服务器响应,根据状态码判断上传是否成功...

    Android文件上传,文件选择器,多选

    在Android应用开发中,文件上传和文件选择器是常见的功能需求。用户可能需要从设备存储中选择一个或多个文件,例如图片、文档或音频文件,然后上传到服务器或进行其他操作。本文将深入探讨如何在Android平台上实现...

    Android 文件上传Demo

    在Android平台上,文件上传是一项常见的任务,特别是在开发涉及用户数据交互的应用时,如社交媒体应用、云存储服务等。本教程将深入探讨如何在Android客户端实现文件及文件夹上传,并介绍服务器端的相关处理。附件中...

    android webview上传文件

    然而,有时我们需要在WebView中处理更复杂的交互,比如上传文件,特别是上传图片。本文将深入探讨如何在Android的WebView中实现文件上传功能,特别是图片上传,并涉及到服务端和客户端的实现细节。 首先,我们要...

    Android多线程文件上传

    2. 多线程上传:为了解决这个问题,开发者可以使用多线程同时上传文件的不同部分。这种方式可以显著缩短总体上传时间,特别是在网络环境不稳定或上传文件较大的情况下。 三、实现多线程上传 1. 使用AsyncTask:...

    android通过http上传文件到服务器

    在Android应用开发中,...总的来说,实现Android通过HTTP上传文件到服务器涉及客户端的HTTP请求构建和服务器端的Servlet处理。理解这个过程,开发者可以有效地在Android应用中集成文件上传功能,与服务器进行数据交互。

    android 文件上传(多个或单个),图片上传

    在Android开发中,文件上传,特别是图片上传,是常见的需求之一。这涉及到用户选择本地文件,通常是图片,然后通过网络接口将这些文件发送到服务器。本文将深入探讨如何实现Android平台上的多文件和单文件上传,以及...

    Android 上传文件到c# webservice

    以上就是Android设备上传文件到C# WebService的基本步骤和关键知识点。实际开发时,要根据项目需求进行相应的调整和优化。参考提供的链接(http://blog.sina.com.cn/s/blog_8d71d5140101fk8r.html),可以找到更具体...

    Android上传文件到 net服务器 包含两方代码

    总之,Android上传文件到.NET服务器涉及客户端与服务器端的交互,需要处理HTTP请求、文件读取和服务器接收等多个环节。通过上述代码示例和注意事项,您可以构建起一个基本的文件上传系统。但实际应用中,可能需要...

    android通过HTTP协议上传文件至远程服务器

    总结,Android通过HTTP协议上传文件至远程服务器涉及到客户端的文件读取、HTTP请求构建与执行,以及服务器端的接收、处理和存储。理解这一过程对于进行Android应用开发至关重要,尤其是涉及到用户数据交互的场景。

    android大文件分段上传

    在Android平台上,大文件的上传是一项挑战,因为考虑到网络稳定性、设备性能以及用户体验等因素。在标题"android大文件分段上传"中提到的方法,是通过使用Socket流将大文件分段进行上传,这是一种有效应对大文件传输...

    android 选择文件上传至服务器 包含服务器代码

    - 对上传文件进行验证,限制可接受的文件类型和大小,防止恶意文件上传。 - 保护服务器免受DoS攻击,限制并发上传的数量。 - 为敏感数据加密,确保传输过程中数据的安全。 9. **性能优化**: - 使用断点续传或...

    android文件上传demo

    首先,Android中的文件上传通常涉及网络操作,因此需要使用到HTTP或HTTPS协议。最常用的库是Android的HttpURLConnection或者第三方库如OkHttp。这两种方式都可以实现文件上传,但OkHttp以其高效和易用性而被广泛应用...

    android开发上传文件

    在Android开发中,上传文件是一项常见的任务,尤其在涉及到用户交互、数据同步或者服务端处理时更为重要。这里,我们主要关注的是如何在Android应用程序中实现文件上传到服务器的功能。这个场景通常涉及到网络编程和...

    Android文件上传.rar

    请求中需要包含上传文件的Content-Type和实际的文件数据。 4. **使用MultipartEntity或RequestBody**:对于包含文件的数据,我们通常使用MultipartEntity(如果你使用的是Apache HttpClient)或RequestBody(如果你...

    Android大文件上传

    一般情况下,我们不能一次性加载整个大文件到内存,而是要采用流式处理(streaming)来分块读取和上传文件。 1. **分块上传**:大文件上传通常采用分块方式,即将大文件切分为多个小块,然后逐个上传。这样可以避免...

    Android实现亚马逊S3文件上传

    - 上传文件:调用`S3TransferUtility.upload()`方法,传入目标Bucket名称、对象键(Key)、本地文件路径。例如: ```java S3TransferUtility transferUtility = S3TransferUtility.create(this, s3Client); ...

    Android手机用http上传文件

    本篇文章将详细讲解如何利用`HttpURLConnection`类来实现在Android设备上实现文件的HTTP上传。 首先,我们需要了解`HttpURLConnection`是Java SDK中的一个基础网络通信组件,它提供了HTTP协议的支持。在Android中,...

Global site tag (gtag.js) - Google Analytics