HttpClient post请求上传文件(java)

背景:基于高可用的编程原则,工作中的文件上传,文件一般存储在分布式文件存储系统上。分布式文件存储系统有的是购买第三方的,有的是公司自己搭建的。不管是哪一种方式,都为开发者提供了接口文档,我们根据接口文档中提供的接口,实现文件上传的功能。

一.方法参数

1.controller层中接收前端传递的文件。 (@RequestParam(value = “fileName”) MultipartFile file)
2.字符串拼接,生成唯一文件名。文中使用 /2019/2/userid/uuid 格式

二.上传方法
1. 创建 HttpClient 的实例
2. 创建某种连接方法的实例,在这里是PostMethod。在PosttMethod 的构造函数中传入待连接的地址
3. 调用第一步中创建好的实例的 execute 方法来执行第二步中创建好的 method 实例
4. 读 response
5. 释放连接。无论执行方法是否成功,都必须释放连接
三:实例
public static String doPost( byte[] fileBytes, String fileName) {
	//拿到fileName拼接URL
	StringBuffer sb=new StringBuffer();
	final String url = sb.append(EmailGradeTask.EMAILGRADETASKUPLOADURL).append(fileName).toString();
    //创建HttpClient实例
	CloseableHttpClient httpClient = HttpClients.createDefault();
	//创建post方法连接实例,在post方法中传入待连接地址
	HttpPost httpPost = new HttpPost(url);
	CloseableHttpResponse response = null;

	try {
	//设置请求参数(类似html页面中name属性)
		MultipartEntityBuilder entity = MultipartEntityBuilder.create();
		entity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
		entity.setCharset(Charset.forName("UTF-8"));
		if(fileBytes!=null) {
		//内容类型,用于定义网络文件的类型和网页的编码,决定文件接收方将以什么形式、什么编码读取这个文件
			ContentType OCTEC_STREAM = ContentType.create("application/octet-stream", Charset.forName("UTF-8"));
			//添加文件
			entity.addBinaryBody("file", fileBytes, OCTEC_STREAM, fileName);
		}
		
		httpPost.setEntity(entity.build());
		//发起请求,并返回请求响应
		response = httpClient.execute(httpPost);
		String uploadResult = EntityUtils.toString(response.getEntity(), "utf-8");
		
		
		System.out.println(uploadResult);
		return uploadResult;

	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		try {
			response.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	return "文件上传错误";
}

总结:

HttpClient请求和我们在浏览器上的请求一样,一个是手动输入url,参数。一个是用程序实现,二者在功能上一样,并无区别。一般接口在浏览器上可以访问,就可以通过HttpClient请求实现。HttpClient请求分为post请求,get请求。get请求中又分为带参数的get请求和不带参数的get请求。

  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值