1. 程式人生 > >Httpclient 以multipart/form-data形式post上傳檔案及提交引數

Httpclient 以multipart/form-data形式post上傳檔案及提交引數

在大學裡由於要做某些英語聽力作業,是在PC客戶端上的,而做完提交後顯示的答案又沒辦法複製,再重新填寫的話答案就消失了,所以懶得去記,好在答案圖片並不複雜,便想做一個可以識別出圖片中的英文的小軟體。因為我自己並沒有做OCR的經驗,於是我就到網上找可以線上識別文字的網站,找著找著找到了一個不錯的網站,識別速度很快,還是免費的,因此開始下手。

首先例行f12,開啟除錯視窗,然而沒有發現請求引數,而是看到了一個陌生的東東:Request Payload,


然後到百度一查才發現一般需要提交檔案就會用multipart/form-data這種形式,這種形式是以分界線來分割資料的,

這種形式提交資料時引數會顯示在Request Payload。

一開始我按照網上的部落格去請求的時候,總是失敗,因為我把分界線和引數名前面的Content-Disposition: form-data;都寫進去請求的name裡了,在這裡大家要注意,只寫name裡的東西,如果有多個的話用;分開

ok。接下來進入正題:如何去構造這樣的post請求。上程式碼:

HttpClient context = new DefaultHttpClient();  
HttpPost post = new HttpPost("url");    
 post.setHeader("Accept-Language","zh-CN,zh;q=0.9");  
post.setHeader("Accept-Encoding","gzip, deflate");  //像header這些自己去設定吧

  MultipartEntityBuilder builder = MultipartEntityBuilder.create();  
  builder.addBinaryBody("name=\"File\"; filename=\"testImg.png\"", new File("C:\\Users\\Administrator\\Desktop\\testImg.png"));//新增檔案
builder.addTextBody("Language", "9");  //新增文字型別引數
post.setEntity(builder.build());  
	        HttpResponse response = context.execute(post);  
	        byte[] res =null;
		        //獲取引數  
	        /**請求傳送成功,並得到響應**/  
	        if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {  
	            res = EntityUtils.toByteArray(response.getEntity());  
	        }
	        System.out.println(Jsoup.parse(new String( uncompress(res),"utf-8")).select("div[class=div_res]"));

還有就是它這個網站返回的是gzip編碼的資料,所以我最後需要解碼,順便附上解碼的程式碼吧

	public static byte[] uncompress(byte[] b) throws IOException {

        ByteArrayOutputStream out = new ByteArrayOutputStream();
        ByteArrayInputStream in = new ByteArrayInputStream(b);
        GZIPInputStream gunzip = new GZIPInputStream(in);
        byte[] buffer = new byte[256];
        int n;
        while ((n = gunzip.read(buffer)) >= 0) {
            out.write(buffer, 0, n);
        }
        return out.toByteArray();
    }

最後大功告成啦