HttpClient多文件上传

这辈子没办法做太多事情,所以每一件都要做到精彩绝伦!

People can‘t do too many things in my life,so everything will be wonderful

项目使用技术SpringMVC + spring + mybatis

HttpClient技术

1       HttpClientService工具类

该工具类封装了get、post、put、delete以及post上传多个文件等方法;包含了有无参数。日常开发,够用了!

一般来说,有些公司会有自己独立的上传下载文件服务器;有些是单应用服务!以上这两种情况,暂用不到该方法。

本文重点讲解使用httpClient进行post请求多文件上传功能(底层是模拟表单提交)。

  • 依赖包及版本

<dependency>

<groupId>org.apache.httpcomponents</groupId>

<artifactId>httpclient</artifactId>

<version>4.3.5</version>

</dependency>

<dependency>

<groupId>org.apache.httpcomponents</groupId>

<artifactId>httpmime</artifactId>

<version>4.3.5</version>

</dependency>

  • 方法代码:

//注入httpClient和requestConfig(spring集成httpClient配置)

@Autowired

privateCloseableHttpClient httpClient;

@Autowired

privateRequestConfig requestConfig;

/**

*

* @描述:httpCilent多图片上传和多个参数

* @创建人:wyait

* @创建时间:2017年5月2日 下午1:47:41

* @param url 请求url

* @param params 请求参数

* @param files file对象

* @return

* @throws IOException

*/

publicHttpResult postUploadFile(String url, Map<String, Object> params,

Map<String,File> files) throws IOException {

HttpPosthttpPost = new HttpPost(url);// 创建 HTTP POST 请求

httpPost.setConfig(this.requestConfig);

MultipartEntityBuilderbuilder = MultipartEntityBuilder.create();

builder.setCharset(Charset.forName("UTF-8"));//设置请求的编码格式

builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);//设置浏览器兼容模式

//设置参数

if(files != null) {

//设置图片参数

for(Map.Entry<String, File> entry : files.entrySet()) {

builder.addBinaryBody(entry.getKey(),entry.getValue());

}

}

//设置参数

if(params != null) {

//设置post参数

for(Map.Entry<String, Object> entry : params.entrySet()) {

//指定编码,防止中文乱码问题。但是某些情况下会导致上传失败

builder.addTextBody(entry.getKey(),

String.valueOf(entry.getValue()),

ContentType.create("text/plain","UTF-8"));

}

}

//生成 HTTP POST 实体

HttpEntityentity = builder.build();

//设置请求参数

httpPost.setEntity(entity);

CloseableHttpResponseresponse = null;

try{

//执行请求

response= httpClient.execute(httpPost);

if(response.getEntity() != null) {

returnnew HttpResult(response.getStatusLine().getStatusCode(),

EntityUtils.toString(response.getEntity(),"UTF-8"));

}

returnnew HttpResult(response.getStatusLine().getStatusCode(),

null);

}finally {

if(response != null) {

response.close();

}

}

}

2       业务场景

现有A前台系统和B服务系统;业务流程:

JSP页面提交文件—>A系统(发送httpClient)—>B系统进行更新数据!

考虑的方案:

1,直接跳过A系统,jsp页面请求B更新数据;

2,A系统进行文件保存后,将路径带到B系统进行更新操作;

以上两种方案的问题点;

方案1,线上B服务,一般是内网服务,不对外开放;否则会有安全问题;

方案2,涉及分布式事务问题;

在网上也百度了很多方法,最终退而求其次,进行两次读写操作,更新数据!

3       实现流程

3.1    jsp页面上传文件

此处略

3.2    A系统处理文件

主要功能是:A系统接收文件,合法性校验后,对图片进行判断和压缩处理,生成一个临时文件;

对于对图片的判断处理这里就不做过多说明了。

重点说一下:

MultipartFile 转成 File对象实现(结合网上资料,总结出最佳实践):

Stringpath=”自定义”+MultipartFile. getOriginalFilename();

File newFile=new File(path);

//直接写文件到指定路径下

MultipartFile.transferTo(newFile);

3.3    调用httpCilent发送请求

主要功能是:调用httpClient已经封装好的postUploadFile(ur,params,files)方法,发送请求;

Map<String, File> files = new HashMap<String, File>();

files.put("newFile", newFile);

//发送请求,并对请求数据进行处理,params自定义

Obj 自定义=httpCilentService.postUploadFile(url, params, files);

3.4    B系统处理数据

B系统通过MultipartFile接收文件数据,并进行更新操作,返回结果;

  • 接收文件:

  • 保存文件:

// 新file

FilenewFile = new File(newFile);

//写文件到磁盘

newPic.transferTo(newFile);

3.5    A系统回调处理数据

A系统在调用B系统后,无论结果ok,还是fail。都删除临时图片;

将该段代码写在finally代码块中:

boolean flag = new File(path).delete();

if(!flag) {

//删除原始图片失败

return"删除临时图片失败,请稍后再试";

}

最后,返回结果到jsp页面

关于HttpClient工具类最好链接:http://blog.csdn.net/column/details/httpclient-arron.html

时间: 2025-01-02 15:36:10

HttpClient多文件上传的相关文章

Android使用HttpClient实现文件上传到PHP服务器,并监控进度条

上传 服务器端PHP 代码如下 : <?php $target_path = "./tmp/";//接收文件目录 $target_path = $target_path.($_FILES['file']['name']); $target_path = iconv("UTF-8","gb2312", $target_path); if(move_uploaded_file($_FILES['file']['tmp_name'], $targ

Android开发之网络请求通信专题(二):基于HttpClient的文件上传下载

上一篇专题Android开发之网络请求通信专题(一):基于HttpURLConnection的请求通信我们讲解了如何使用httpurlconnection来实现基本的文本数据传输.一般在实际开发中我们可以用于传输xml或者json格式的数据.今天我们来讲解另外一种http网络请求的方式:httpclient,并实现文件的上传和下载. 在这里插个题外话,其实这些网络请求有很多第三方jar包可以使用,这些包都封装得很好了.如果只是想使用,我们就直接拿别人得jar包来用就好.博主这里推荐一个叫xuti

HttpClient构造文件上传

在项目中我们有时候需要使用到其他第三方的api,而有些api要求我们上传文件,search一下,下面将结果记录一下喽! 含义 ENCTYPE="multipart/form-data" 说明: 通过 http 协议上传文件 rfc1867协议概述,jsp 应用举例,客户端发送内容构造 1.概述在最初的 http 协议中,没有上传文件方面的功能. rfc1867 (http://www.ietf.org/rfc/rfc1867.txt) 为 http 协议添加了这个功能.客户端的浏览器,

httpclient 实现文件上传中转

开发功能: web前端提交上传文件 -> a服务器接收 -> 转发到b服务器进行文件处理 下面是简单实现的代码,具体细节优化根本自己的需求更改. public String handleResponse(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException, IOException { String method = request.getMethod(); S

使用 HttpClient 进行文件上传

1.使用 AddPart 方法 public static void upload(String authorization,String baseUrl,String filePath,String userId,String isOverWrite,String remotePath){ CloseableHttpClient client = HttpClients.createDefault(); String uploadFile_url = Utils.getValue("uploa

Android网络编程之使用HttpClient批量上传文件(二)AsyncTask+HttpClient并实现上传进度监听

请尊重他人的劳动成果,转载请注明出处: Android网络编程之使用HttpClient批量上传文件(二)AsyncTask+HttpClient并实现上传进度监听 运行效果图: 我曾在<Android网络编程之使用HttpClient批量上传文件>一文中介绍过如何通过HttpClient实现多文件上传和服务器的接收.在上一篇主要使用Handler+HttpClient的方式实现文件上传.这一篇将介绍使用AsyncTask+HttpClient实现文件上传并监听上传进度. 监控进度实现: 首先

Android开发之httpclient文件上传实现

文件上传可能是一个比較耗时的操作,假设为上传操作带上进度提示则能够更好的提高用户体验,最后效果例如以下图: 项目源代码:http://download.csdn.net/detail/shinay/4965230 这里仅仅贴出代码,可依据实际情况自行改动. [java] view plaincopy package com.lxb.uploadwithprogress.http; import java.io.File; import org.apache.http.HttpResponse;

转 使用 HttpClient 4 进行文件上传

http://www.tuicool.com/articles/Y7reYb 1. 概述 本教程我们将描述如何使用 HttpClient 4进行一次多文件上传操作 . 我们将使用  http://echo.200please.com  作为测试服务器,因为它是面向公众的,并且接受大多数类型的内容. 如果你想要深入学习并了解你可以使用  HttpClient 做到的其它很棒的事情  – 那就去看看 首要的 HttpClient 教程吧   . 2. 使用  AddPart  方法 让我们开始研究研

springMVC + hadoop + httpclient 文件上传请求直接写入hdfs

springMVC + hadoop + httpclient 文件上传请求直接写入hdfs