Httpclient 以multipart/form-data形式post上傳檔案及提交引數
阿新 • • 發佈:2019-01-05
在大學裡由於要做某些英語聽力作業,是在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(); }
最後大功告成啦