Android多文件上传的原理

android上面图片的上传可以用apache包里面的httpclient和MultipartEntity来上传图片,这种的上传方式的话由于都封装好了所以看不到HTTP协议里面具体是怎样上传的;

其实图片的上传还可以用Java自带的HttpURLConnection来做上传处理,例如有一个PHP写的接收图片的POST接口http://localhost/upload/upload.php,参数如下:

name 名称

address 地点

img[] 图片(支持多张图片上传)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

 

这时假如我们上传的参数为:

name值为this is the parameter:name

address值为this is the parameter:address

img[]的值为两张图片,路径为E:\Photos\test_1.jpg 和E:\Photos\test_2.jpg

那么我们写的POST网络请求的方法体应该为下面的格式:

-----------------------------7dc2fd5c0894

Content-Disposition: form-data; name="name"

 

this is the parameter:name

-----------------------------7dc2fd5c0894

Content-Disposition: form-data; name="address"

 

this is the parameter:address

-----------------------------7dc2fd5c0894

Content-Disposition: form-data; name="img[]"; filename="E:\Photos\test_1.jpg"

Content-Type: image/pjpeg

 

<图片E:\Photos\test_1.jpg的二进制数据未显示>

---------------------------7dc2fd5c0894

Content-Disposition: form-data; name="img[]"; filename="E:\Photos\test_2.jpg"

Content-Type: image/pjpeg

 

<图片E:\Photos\test_2.jpg的二进制数据未显示 >

-----------------------------7dc2fd5c0894--

 

根据上面的格式我们写的上传图片的Java代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
                                         
public class Main {
                                         
     public static void main(String[] args) {
         List list = new ArrayList();
         list.add( "E:\\Photos\\test_1.jpg" ); //要上传的文件路径
         list.add( "E:\\Photos\\test_2.jpg" ); //要上传的文件路径
                                         
         upload( "this is the parameter:name" , "this is the parameter:address" ,
                 list);
     }
                                         
     public static void upload(String name, String address, List list) {
                                         
         try {
             // 定义数据分隔线
             String BOUNDARY = "------------------------7dc2fd5c0894" ;
             // 定义最后数据分隔线
             byte [] end_data = ( "\r\n--" + BOUNDARY + "--\r\n" ).getBytes();
                                         
             URL url = new URL( "http://localhost/upload/upload.php" );
             HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                                         
             conn.setDoOutput( true );
             conn.setDoInput( true );
             conn.setUseCaches( false );
             conn.setRequestMethod( "POST" );
             conn.setRequestProperty( "connection" , "Keep-Alive" );
             conn.setRequestProperty( "user-agent" ,
                     "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)" );
             conn.setRequestProperty( "Charsert" , "UTF-8" );
             conn.setRequestProperty( "Content-Type" ,
                     "multipart/form-data; boundary=" + BOUNDARY);
                                         
             OutputStream out = new DataOutputStream(conn.getOutputStream());
                                         
             // name参数
             StringBuffer params = new StringBuffer();
             params.append( "--" + BOUNDARY + "\r\n" );
             params.append( "Content-Disposition: form-data; name=\"name\"\r\n\r\n" );
             params.append(name);
             params.append( "\r\n" );
                                         
             // address参数
             params.append( "--" + BOUNDARY + "\r\n" );
             params.append( "Content-Disposition: form-data; name=\"address\"\r\n\r\n" );
             params.append(address);
             params.append( "\r\n" );
                                         
             out.write(params.toString().getBytes());
                                         
             int leng = list.size();
             for ( int i = 0 ; i < leng; i++) {
                 String fname = list.get(i);
                 File file = new File(fname);
                                         
                 StringBuilder sb = new StringBuilder();
                 sb.append( "--" );
                 sb.append(BOUNDARY);
                 sb.append( "\r\n" );
                 sb.append( "Content-Disposition: form-data;name=\"img[]\";filename=\""
                         + file.getName() + "\"\r\n" );
                 // 这里不能漏掉,根据文件类型来来做处理,由于上传的是图片,所以这里可以写成image/pjpeg
                 sb.append( "Content-Type:image/pjpeg\r\n\r\n" );
                 out.write(sb.toString().getBytes());
                                         
                 DataInputStream in = new DataInputStream( new FileInputStream(
                         file));
                 int bytes = 0 ;
                 byte [] bufferOut = new byte [ 1024 ];
                 while ((bytes = in.read(bufferOut)) != - 1 ) {
                     out.write(bufferOut, 0 , bytes);
                 }
                 out.write( "\r\n" .getBytes());
                 in.close();
             }
             out.write(end_data);
             out.flush();
             out.close();
                                         
             // 定义BufferedReader输入流来读取URL的响应
             BufferedReader reader = new BufferedReader( new InputStreamReader(
                     conn.getInputStream()));
             String line = null ;
             while ((line = reader.readLine()) != null ) {
                 System.out.println(line);
             }
                                         
         } catch (Exception e) {
             System.out.println( "发送POST请求出现异常!" + e);
             e.printStackTrace();
         }
     }
                                         
}

 

这样就可以把多张图片和参数上传到服务器了。当然这里只是一个演示,是用php写的接口并只是简单的把图图片保存在了接口文件的当前文件夹下;另外图片也没有做压缩,android手机上面上传时一般会做压缩,而且也不会一个接口上传多张图片,网络差时给用户的体验很不好,但是对于互联网开发者来说深入理解HTTP协议对表单是怎样处理的这个还是很重要

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值