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();
    }

最后大功告成啦

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值