HttpClient多文件上传

简介:

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

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

 

项目使用技术SpringMVC + spring + mybatis

HttpClient技术

1       HttpClientService工具类

该工具类封装了getpostputdelete以及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>

  • 方法代码:

//注入httpClientrequestConfig(spring集成httpClient配置)

@Autowired

         privateCloseableHttpClient httpClient;

 

         @Autowired

         privateRequestConfig requestConfig;

/**

          *

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

          * @创建人:wyait

          * @创建时间:201752 下午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更新数据;

2A系统进行文件保存后,将路径带到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已经封装好的postUploadFileur,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接收文件数据,并进行更新操作,返回结果;

  • 接收文件:

wKiom1kJpauCPv0sAAAzA8jtxjs447.png

  • 保存文件:

// 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

 




本文转自 wyait 51CTO博客,原文链接:http://blog.51cto.com/wyait/1921698,如需转载请自行联系原作者
相关文章
|
存储 安全 测试技术
C# 中模拟HTTPS提交及模拟文件上传
【1月更文挑战第5天】昨天讲到用C#模拟POST还有GET进行数据提交,如果遇到的是https或者一些特殊信道的提交昨天的代码就会跑不通,今天就来说一下C#中https的提交以及模拟文件上传
|
资源调度 JavaScript 前端开发
【TypeScript】TS 看这一篇就够了
【TypeScript】TS 看这一篇就够了
1292 0
|
11月前
|
人工智能 自然语言处理 程序员
通义灵码:融合创新玩法与探索,重塑LeetCode解题策略
欢迎来到工程师令狐小哥的频道。本文介绍如何利用AI工具高效刷LeetCode,通过通义灵码插件在IntelliJ IDEA中实现代码生成、优化、单元测试等功能,提升编程学习效率。
392 1
通义灵码:融合创新玩法与探索,重塑LeetCode解题策略
|
10月前
|
前端开发 JavaScript API
React 搜索组件 Search Box
本文介绍了如何在 React 中实现一个搜索组件,从基础的输入框和按钮创建开始,逐步讲解样式美化、常见问题及易错点的解决方法,包括输入延迟、空值处理、错误处理和状态管理等,帮助开发者构建高效、可靠的搜索功能。
494 4
|
10月前
|
算法 物联网 开发者
In-Context LoRA实现高效多任务图像生成,开启视觉创作新篇章
这篇文章介绍了通义实验室提出的In-Context LoRA,这是一种基于现有文本到图像模型的任务无关性框架,用于实现高质量的多任务图像生成。
1500 11
In-Context LoRA实现高效多任务图像生成,开启视觉创作新篇章
|
10月前
|
人工智能 JavaScript 数据可视化
深入探索 Flux Tools 在 AI 图像创作中的强大功能
Flux Tools 是由 Black Forest Labs 开发的一套先进 AI 图像编辑工具,集成了修补、扩展、深度映射和边缘检测等功能,为用户提供高精度的图像控制能力,广泛应用于照片编辑、数字艺术创作和设计工作等领域,极大提升了创作效率与自由度。
|
11月前
|
编解码 物联网 计算机视觉
实战 | 猫猫、少女、FLUX、ControlNet
魔搭社区集结了来自多个组织的 FLUX ControlNet 模型,魔搭社区的开源项目 DiffSynth-Studio 为这些模型提供了支持,今天就随我们一起,体验一下这些 FLUX ControlNet 模型的神奇生成能力。
|
11月前
|
XML 存储 缓存
C#使用XML文件的详解及示例
C#使用XML文件的详解及示例
438 0
|
存储 消息中间件 缓存
Redis:内存数据存储与缓存系统的技术探索
**Redis 概述与最佳实践** Redis,全称Remote Dictionary Server,是流行的内存数据结构存储系统,常用于数据库、缓存和消息中介。它支持字符串、哈希、列表等数据结构,并具备持久化、主从复制、集群部署及发布/订阅功能。Redis适用于缓存系统、计数器、消息队列、分布式锁和实时系统等场景。最佳实践包括选择合适的数据结构、优化缓存策略、监控调优、主从复制与集群部署以及确保安全配置。
289 3