前言

不知道大家在工作中有没有碰到过在代码级别中进行上传和下载呢,一般的场景为调用第三方的接口进行上传大文件和下载大文件。

我一个小伙伴最近在工作中就碰到了,他需要在代码中调用第三方http接口进行原始文件的上传,然后需要调用第三方接口把第三方服务处理好的数据文件下载到本地。他说其实没什么技术难度,百度了下,代码示例也很多,httpclient就支持上传文件和下载,就是代码写的太多了,不怎么优雅。

他给我看了httpclient的上传代码:

String uploadUrl = "http://xxxxx.com/upload";HttpPost httpPost = new HttpPost(uploadUrl);FileBody fileBody = new FileBody(new File("C:/Users/Administrator/Desktop/source.excel"));MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();multipartEntityBuilder.addPart("file",fileBody);

// 设置其他参数List nvps = new ArrayList();nvps.add(new NameValuePair("Accept","application/json, text/plain, */*"));nvps.add(new NameValuePair("Accept-Encoding","gzip, deflate, br"));nvps.add(new NameValuePair("Accept-Language","zh-CN,zh;q=0.9"));nvps.add(new NameValuePair("Connection","keep-alive"));nvps.add(new NameValuePair("Content-Length","28700"));nvps.add(new NameValuePair("Content-Type","multipart/form-data; boundary=----WebKitFormBoundarypaEfQmIQBbUrkI0c"));nvps.add(new NameValuePair("Host","xxxxx.com"));nvps.add(new NameValuePair("Origin","http://xxxxx.com"));nvps.add(new NameValuePair("Referer","xxxxx.com/admin/goods_edit.html"));nvps.add(new NameValuePair("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36"));HttpEntity reqEntity  = multipartEntityBuilder.build();httpPost.setEntity(reqEntity);try {  CloseableHttpResponse response = httpClient.execute(httpPost);  System.out.println("上传之后返回的状态码:"+response.getStatusLine().getStatusCode());try {    HttpEntity resEntity = response.getEntity();    respStr = getRespString(resEntity);    EntityUtils.consume(reqEntity);  } catch (Exception e) {    e.printStackTrace();  } finally {    response.close();  }} catch (IOException e) {  e.printStackTrace();}System.out.println("resp=" + respStr);

因为要从代码里进行上传远端,需要建立一个MultipartEntityBuilder,设置各种header,小伙伴问我有什么框架可以提供更加优雅的写法。

其实很多框架都有更加简洁的API,但是我还是推荐给了他最近一款比较火的框架:Forest

这个框架我以前也有写文推荐过:一款直击痛点的优秀http框架,让我超高效率完成了和第三方接口的对接

Forest 是一款主要致力于http请求各个场景的工具框架,基本上几行代码就可以解决几乎大部分的http的场景,api主打易用性,提供了很多特性,符合国内开发者的习惯,而且作者更新也比较勤快。目前的稳定release版本可用于生产环境。

项目主页地址:https://gitee.com/dt_flys/forest用forest实现上传和下载

Forest能解决大部分http场景中的问题,对于上传下载,作者在最新的版本中提供了上传下载功能,能够以最简单的方式实现,极大程度方便了开发者。

对于想了解Forest其他功能的童鞋,可以去项目主页或者我之前写的文章了解下。这里仅介绍用Forest上传和下载的新特性。

这里以springboot项目为例,依赖Forest

<dependency>    <groupId>com.dtflys.forest</groupId>    <artifactId>spring-boot-starter-forest</artifactId>    <version>1.4.6</version></dependency>

定义RemoteDataHander接口:

public interface RemoteDataHander{  @Post(url = "http://xxxxx.com/upload")  void upload(@DataFile("file") File file, OnProgress onProgress);

  @Get(url = "http://xxxxx.com/report/xxx.zip")  @DownloadFile(dir = "${0}")  void downloadFile(String dir, OnProgress onProgress);}

这个接口会被Forest扫描组件在启动时扫描到并注册进spring容器,然后就可以像使用本地方法一样去调用进行上传和下载操作了。

参数中声明的OnProgress参数,是一个接口,你可以去实现它去完成进度的回调:

File file = myClient.downloadFile("D:\\TestDownload", progress -> {    System.out.println("total bytes: " + progress.getTotalBytes());   // 文件大小    System.out.println("current bytes: " + progress.getCurrentBytes());   // 已下载字节数    System.out.println("progress: " + Math.round(progress.getRate() * 100) + "%");  // 已下载百分比    if (progress.isDone()) {   // 是否下载完成        System.out.println("--------   Download Completed!   --------");    }});

上传和下载都可以去实现OnProgress的,当然你也可以不传。

一些其他参数的用法

除了上述例子的用法,Forest也支持其他类型的文件参数和返回参数,如文件流,字节数组,MultipartFile类型等等。用法如下:

上传:

/** * File类型对象 */@Post(url = "http://xxxxx.com/upload")Map upload(@DataFile("file") File file, OnProgress onProgress);

/** * byte数组 * 使用byte数组和Inputstream对象时一定要定义fileName属性 */@Post(url = "http://xxxxx.com/upload")Map upload(@DataFile(value = "file", fileName = "${1}") byte[] bytes, String filename);

/** * Inputstream 对象 * 使用byte数组和Inputstream对象时一定要定义fileName属性 */@Post(url = "http://xxxxx.com/upload")Map upload(@DataFile(value = "file", fileName = "${1}") InputStream in, String filename);

/** * Spring Web MVC 中的 MultipartFile 对象 */@PostRequest(url = "http://xxxxx.com/upload")Map upload(@DataFile(value = "file") MultipartFile multipartFile, OnProgress onProgress);

/** * Spring 的 Resource 对象 */@Post(url = "http://xxxxx.com/upload")Map upload(@DataFile(value = "file") Resource resource);

下载

/** * 返回类型用byte[],可将下载的文件转换成字节数组 */@GetRequest(url = "http://localhost:8080/images/test-img.jpg")byte[] downloadImageToByteArray();

/** * 返回类型用InputStream,用流的方式读取文件内容 */@Request(url = "http://localhost:8080/images/test-img.jpg")InputStream downloadImageToInputStream();

其中下载返回的字节数组和输入流,可以用于自定义操作

一些感受

从使用者角度去出发,Forest给了一个非常友好的api,而且声明和配置都非常简单。极大程度的方便了开发者。不光上传下载场景,在其他常用的http的调用场景中,Forest也面面俱到,是一个http层面一站式解决式工具。有兴趣的同学可以去看看,一定会提高你http场景的开发效率。

我也曾和作者探讨过当下http领域的一些框架以及Forest的发展路线。作者比较谦虚,回答了我一些问题:

作者一直都表示,希望把各种http的场景做到极致,使开发者真正能用几行代码就能优雅的实现复杂的http的场景,做开源项目不易,为这种工匠精神点赞。希望forest以后能为更多开发者在工作中解决痛点。

关注作者

我是铂赛东,一个认真温暖且执着的男生,我坚持做原创的技术科技分享号,希望你能关注我,我每周会出一篇实用的原创科技&技术文章,陪着你一起走,一起成长。

httpclient base64 文件上传_代码级别的上传下载神器相关推荐

  1. httpclient base64 文件上传_文件上传下载

    说道文件上传下载,这个业务需求并不是很复杂思想如下 1.将文件上传到 某台服务器上的指定的路径下也可以这样理解 文件上传就是将本地图片发送到别的地方,下载就是将别的地方的图片放在本地 2.将路径同文件 ...

  2. php$上传_如何实现PHP上传视频的功能?(图文+视频)

    本篇文章主要给大家讲解PHP上传视频的具体实现方法. 实现PHP视频上传的功能,对于新手来说,可能有一定的难度.但是通过本篇文章的介绍,相信大家都能熟练掌握相关知识. 那么在之前的文章[PHP文件上传 ...

  3. 计算机网络 文件传输小程序代码,懒得打开电脑传文件?这四类小程序把这事解决了...

    生命在于静止,主持人吴昕这句火爆的口头禅,诠释了当代人对于"懒"的追求. 懒得出门吃饭,有外卖:懒得下载应用,有小程序... 在办公场景下,更是要"懒"到底,不 ...

  4. 机器人曲轴上下料_曲轴生产线自动上下料机器人的解决方案

    一.客户情况: 客户是专业生产汽车曲轴的厂家,曲轴生产线多数由数控车床和专用机床组成,自动线上设备有车床.磨床,滚压机,平衡机,抛光机.清洗机和曲轴系列专机等先进设备对主轴颈.连杆轴颈进行数控车削.磨 ...

  5. cordova 安卓文件多选_安卓手机清理大师app下载-安卓手机清理大师下载v1.0.0安卓版...

    安卓手机清理大师是一款专业的安卓手机清理工具,可以帮助用户随时清理手机垃圾,除此之外,还可以在线进行手机病毒查杀,防止病毒文件入侵,拥有电池电量维护管理服务,随时查看手机充电.耗电和剩余电量情况,多种 ...

  6. httpclient base64 文件上传_选择HttpClient还是OkHttp?

    来源:https://urlify.cn/IBbMRn 写在前面 为什么会写这篇文章,起因于和朋友的聊天 这又触及到我的知识盲区了,首先来一波面向百度学习,直接根据关键字httpclient和okht ...

  7. python 上传文件到网络设备_基于python实现上传文件到OSS代码实例

    基础环境 # +++++ 阿里云oss开发指南里都有详细的步骤,在这里整理了一下自己需要的东西 # 确定开发环境,centos默认安装了python2.7 # python -v # 安装python ...

  8. gitlab 只能owner 上传_代码管理-gitlab使用方法建议

    对gitlab的使用主要从两个角度去分析,一个是管理员,一个是开发提交者. 1. 管理员使用 1.1 初始配置 浏览器访问 http://服务器IP:11000 第一次访问会默认以root管理员用户登 ...

  9. tftp c++ 上传_如何在 Fedora 上建立一个 TFTP 服务器

    TFTP 即简单文本传输协议,允许用户通过 UDP 协议在系统之间传输文件. -- Curt Warfield(作者) TFTP 即 简单文本传输协议(Trivial File Transfer Pr ...

最新文章

  1. Http接口请求Long类型数据JsonObject反解析精度丢失问题
  2. 我们离爱因斯坦想了解的“上帝的思想”,还有多远?
  3. bpmn2 vue 设计器_vue项目中使用bpmn-基础篇
  4. GitLab 简易指引(三):备份与恢复
  5. c语言五子棋人机对弈算法,使用canvas基于AI算法实现人机对战之五子棋
  6. hive外部表/内部表路径知识点
  7. eight_queens
  8. 熊猫read_csv()–将CSV文件读取到DataFrame
  9. Java常用类(三):FileUtils类
  10. 安卓UI相关开源项目库汇总
  11. 计算机屏幕上的显示记录,什么样的桌面日历便笺既可以显示日期又可以提醒我所记录的时间表...
  12. 硬盘分区表损坏修复实录
  13. 问题描述:vcenter上数据存储的事件中有大量的警告,还有偶尔的报错,存储设备naa...的路径冗余已降级,路径。。已关闭,受影响的数据存储 与存储设备。。。连接丢失,路径。。已断开,受影响的存储
  14. 安装Dev c++后,编译文件出现未编译的解决方法
  15. python的request发请求报500原因
  16. 长短期记忆(LSTM)
  17. KVM+WebVirtMgr部署安装笔记
  18. 2021年R1快开门式压力容器操作最新解析及R1快开门式压力容器操作证考试
  19. Snappy压缩库安装和使用之一
  20. OpenGL学习记录

热门文章

  1. Godaddy Windows主机组件支持情况
  2. TortoiseSVN 不显示图标
  3. Echarts文字大小自适应,案例详解
  4. TensorFlow2.0(十一)--理解LSTM网络
  5. 7-71 爬动的蠕虫 (15 分)
  6. 两个有序链表序列的合并编程
  7. spring boot实现WebMvcConfigurer接口定制SpringMvc配置
  8. LeetCode-321 Create Maximum Number
  9. LintCode 69---二叉树的层次遍历
  10. Exchange日志清理