使用multipart/form-data上傳文件

1.使用POST發送數據   java

 以POST方式發送數據主要是爲了向服務器發送較大量的客戶端的數據,它不受URL的長度限制。POST請求將瀏覽器

數據以URL編碼的形式放在HTTP正文中,字段形式爲fieldname=value,用&分隔每一個字段。注意全部的字段都緩存

被做爲字符串處理。實際上咱們要作的就是模擬瀏覽器POST 一個表單。如下是IE發送一個登錄表單的POST請服務器

求:

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


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


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


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


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


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");
spa


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類型的請求的例子

/*打開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();
相關文章
相關標籤/搜索