使用multipart/form-data上传文件

1.使用POST发送数据   

 以POST方式发送数据主要是为了向服务器发送较大量的客户端的数据,它不受URL的长度限制。POST请求将

数据以URL编码的形式放在HTTP正文中,字段形式为fieldname=value,用&分隔每个字段。注意所有的字段都

被作为字符串处理。实际上我们要做的就是模拟浏览器POST 一个表单。以下是IE发送一个登陆表单的POST请

求:

POST http://127.0.0.1/login.do HTTP/1.0


Accept: image/gif, image/jpeg, image/pjpeg, */*


Accept-Language: en-us,zh-cn;q=0.5


Content-Type: application/x-www-form-urlencoded


User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)


Content-Length: 28

username=admin&password=1234

要在MIDP应用程序中模拟浏览器发送这个POST请求,首先设置HttpConnection的请求方式为POST:

hc.setRequestMethod(HttpConnection.POST);

然后构造出HTTP正文:

byte[] data = "username=admin&password=1234".getBytes();

并计算正文长度,填入Content-Type和Content-Length:

hc.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");


hc.setRequestProperty("Content-Length", String.valueOf(data.length));

然后打开OutputStream将正文写入:

OutputStream output = hc.openOutputStream();


output.write(data);

需要注意的是,数据仍需要以URL编码格式编码,由于MIDP库中没有J2SE中与之对应的URLEncoder类,因此,

需要自己动手编写这个 encode()方法,可以参考java.net.URLEncoder.java的源码。剩下的便是读取服务器响

应,代码与GET一致,这里就不再详述。

2.使用multipart/form-data发送文件

如果要在MIDP客户端向服务器上传文件,我们就必须模拟一个POST multipart/form-data类型的请求,Content-

Type必须是multipart/form-data。

以multipart/form-data编码的POST请求格式与application/x-www-form-urlencoded完全不同,multipart/form-

data需要首先在HTTP请求头设置一个分隔符,例如ABCD:


hc.setRequestProperty("Content-Type", "multipart/form-data; boundary=ABCD");


然后,将每个字段用“--分隔符”分隔,最后一个“--分隔符--”表示结束。例如,要上传一个title字段"Today"和一

个文件C:\1.txt,HTTP正文如下:

--ABCD

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

\r\n

Today

--ABCD

Content-Disposition: form-data; name="1.txt"; filename="C:\1.txt"

Content-Type: text/plain

\r\n

<这里是1.txt文件的内容>

--ABCD--

\r\n

3.使用post请求上传文件:模拟一个POST multipart/form-data类型的请求的例子

?
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
/*打开url连接
                * 此处的urlConnection对象实际上是根据URL的 请求协议(此处是http)生成的URLConnection类
                * 的子类HttpURLConnection,故此处最好将其转化为HttpURLConnection类型的对象,
                * 以便用到HttpURLConnection更多的API*/
               HttpURLConnection httpURLConnection = (HttpURLConnection) url
                   .openConnection();
               
               /*http头
                * 设置每次传输的流大小,可以有效防止手机因为内存不足崩溃,此方法用于在预先不知道内容长度时启用,
                * 没有进行内部缓冲的 HTTP 请求正文的流。*/
               httpURLConnection.setChunkedStreamingMode( 128  1024 ); // 128K
               // 允许输入输出流
               httpURLConnection.setDoInput( true ); // 设置是否从httpUrlConnection读入,默认情况下是true
               /*设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在 
                 http正文内,因此需要设为true, 默认情况下是false*/
               httpURLConnection.setDoOutput( true );
               // Post 请求不能使用缓存
               httpURLConnection.setUseCaches( false ); //没有进行内部缓冲
               // 设定请求的方法为"POST",默认是GET
               httpURLConnection.setRequestMethod( "POST" );
               httpURLConnection.setRequestProperty( "Connection" "Keep-Alive" );
               httpURLConnection.setRequestProperty( "Charset" "UTF-8" );
               //首先在HTTP请求头设置一个分隔符*****
               httpURLConnection.setRequestProperty( "Content-Type" ,
                   "multipart/form-data;boundary="  + boundary);
               //httpURLConnection.connect(); // 连接
               
               /*http请求的正文,正文的内容是通过outputStream流写入的
                * 此处getOutputStream会隐含的进行connect(即:如同调用上面的connect()方法, 
                  所以在开发中不调用上述的connect()也可以)。*/
 
               DataOutputStream dos =  new  DataOutputStream(
                   httpURLConnection.getOutputStream());
               //每个字段用“--”分隔
               dos.writeBytes(twoHyphens + boundary + end);
               /*srcPath.substring(srcPath.lastIndexOf("/") + 1):表示文件名字
                * */
               dos.writeBytes( "Content-Disposition: form-data; name=\"uploadedfile\"; filename=\""
                   + srcPath.substring(srcPath.lastIndexOf( "/" ) +  1 )
                   "\""
                   + end);
               dos.writeBytes(end);
         //上传的文件的内容
               FileInputStream fis =  new  FileInputStream(srcPath);
               byte [] buffer =  new  byte [ 8192 ];  // 8k
               int  count =  0 ;
               // 读取文件
               while  ((count = fis.read(buffer)) != - 1 ){
                 dos.write(buffer,  0 , count);
               }
               fis.close();
         
               dos.writeBytes(end);
               dos.writeBytes(twoHyphens + boundary + twoHyphens + end);
               dos.flush();
         
            // 在调用下边的getInputStream()函数时才将内存缓冲区中封装好的完整的HTTP请求电文发送到服务端。 
               InputStream is = httpURLConnection.getInputStream();
            //至此,http请求已经被发送到服务器
               InputStreamReader isr =  new  InputStreamReader(is,  "utf-8" );
               BufferedReader br =  new  BufferedReader(isr);
             //BufferedReader br = new BufferedReader(new InputStreamReader
             //        (httpURLConnection.getInputStream(),"utf-8"));
               /*获取返回结果.
                * 在getInputStream()函数调用的时候,就会把准备好的http请求 正式发送到服务器了,
                * 然后返回一个输入流,用于读取服务器对于此次http请求的返回信息。*/
               String result = br.readLine();
               Toast.makeText(c, result, Toast.LENGTH_SHORT).show();
               dos.close();
               is.close();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值