使用HttpClient发送文件流到服务器端
适用场景:
网络绝对路径的URL文件或图片,不存储到本地,转换成stream,直接使用HTTPClient传送到SpringBoot的服务端,将文件存储下来,并返回一个文件地址。目前分层架构的系统越来越多这种需求,所以记录下来以备不时之需。 1、调用端
首先引入httpclient所需包
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.4</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.4</version>
</dependency>
调用代码:
package test.http; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils; import java.io.*;
import java.net.URL;
import java.nio.charset.Charset; /**
* 文件传送
* 发送文件流到服务器端
* 服务器端使用SpringBoot的MultipartFile接收
*
* 适用场景:
* 绝对路径的URL文件,不存储到本地,转换成stream,直接使用HTTPClient传送到SpringBoot
*
*/
public class TestUpload { public static void main(String[] args) {
//文件URL,此处取豆瓣上的一个图片
String fileUrl ="https://img1.doubanio.com/view/photo/l/public/p2537149328.webp";
try {
//提取到文件名
String fileName = fileUrl.substring(fileUrl.lastIndexOf("/")+1);
//转换成文件流
InputStream is = new URL(fileUrl).openStream(); //接收文件的服务器地址
String uploadURL = "http://localhost:8003/fileupload"; //创建HttpClient
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(uploadURL);
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
/*绑定文件参数,传入文件流和contenttype,此处也可以继续添加其他formdata参数*/
builder.addBinaryBody("file",is, ContentType.MULTIPART_FORM_DATA,fileName);
HttpEntity entity = builder.build();
httpPost.setEntity(entity); //执行提交
HttpResponse response = httpClient.execute(httpPost);
HttpEntity responseEntity = response.getEntity();
if(responseEntity != null){
//将响应的内容转换成字符串
String result = EntityUtils.toString(responseEntity, Charset.forName("UTF-8")); //此处根据服务器返回的参数转换,这里返回的是JSON格式
JSONObject output = JSON.parseObject(result);
JSONArray body = output.getJSONArray("body");
String resUrl = body.get(0)+""; System.out.println(resUrl);
}
if(is != null){
is.close();
}
}catch (Exception ex){
ex.printStackTrace();
} }
}
2、服务端
服务端直接使用MultipartFile接收即可
/**
* 上传文件
*
* @throws BusinessException
*/
@PostMapping("")
public String upload(@RequestParam(defaultValue = "", required = false) String prefix,
@RequestParam("file") MultipartFile... files) throws BusinessException {
ResultView<List<String>> resultView = new ResultView<>();
List<String> list = new ArrayList<>();
for (MultipartFile file : files) {
if (file.isEmpty()) {
log.warn("have empty upload file,you need check is right?");
continue;
}
String filepath = storageService.store(file, prefix);
list.add(fileServerAddress + filepath.replaceAll("\\\\", "/"));
} resultView.setBody(list);
log.info(JSONObject.toJSONString(resultView));
return JSONObject.toJSONString(resultView);
}
具体如何存储如何返回,因人而异,我这里返回的是JSON字符串。
其他:本文参考了博友Vincent-Li的博文,表示感谢:
https://www.cnblogs.com/lyxy/p/5629151.html
使用HttpClient发送文件流到服务器端的更多相关文章
- {网络编程}和{多线程}应用:基于TCP协议【实现多个客户端发送文件给一个服务器端】--练习
要求: 实现多个客户端发送文件给一个服务器端 提示:多个人创建客户端发送文件,服务端循环接收socket,从socket中获取文件 说明:这里我们只要建立一个服务端就可以了,然后让多台电脑使用客户端给 ...
- 童鞋,[HttpClient发送文件] 的技术实践请查收
1.荒腔走板 前几天有个童鞋在群里面问:怎么使用HttpClient发送文件? 之前我写了一个ABP上传文件,主要体现的是服务端,上传文件的动作是由前端小姐姐完成的, 我还真没有用HttpClient ...
- 使用HttpClient以文件流的方式上传文件(非multipartFormData方式)
@Test public void testAdd() throws IOException { HttpPost post = new HttpPost("http://localhost ...
- httpclient 发送文件和字符串信息
HttpPost httpPost = new HttpPost(url); MultipartEntity reqEntity = new MultipartEntit ...
- httpClient 发送请求后解析流重用的问题(HttpEntity的重用:BufferedHttpEntity)
使用场景: 项目中使用httpClient发送一次http请求,以流的方式处理返回结果,开始发现返回的流只能使用一次,再次使用就会出错,后来看了一些解决方案,EntityUtils.consume(r ...
- .NET Core Web API使用HttpClient提交文件的二进制流(multipart/form-data内容类型)
需求背景: 在需要通过服务端请求传递文件二进制文件流数据到相关的服务端保存时,如对接第三方接口很多情况下都会提供一个上传文件的接口,但是当你直接通过前端Ajax的方式将文件流上传到对方提供的接口的时候 ...
- HttpClient构造文件上传
在项目中我们有时候需要使用到其他第三方的api,而有些api要求我们上传文件,search一下,下面将结果记录一下喽! 含义 ENCTYPE="multipart/form-data&quo ...
- Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- Android系列之网络(一)----使用HttpClient发送HTTP请求(通过get方法获取数据)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
随机推荐
- Python高级笔记(一) -- GIL (全局解释器锁)
1. GIL概念 (cpython历史遗留问题) 概念? 对Python多线程的影响? 编写一个多线程抓取网页的程序? 阐述多线程抓取程序是否比单线程性能有提升, 并解释原因. GIL:全局解释器锁, ...
- mongodb增加新字段报错解决方法
今天想在项目的一个集合里增加一个新字段 db.article.update({},{$set:{status:0}},{multi:true}) multi : 可选,mongodb 默认是false ...
- iptables 防火墙日常
. 检查机目标机器 httpd 服务/etc/init.d/httpd status ========================================================= ...
- Java中ArrayList类的用法
1.什么是ArrayList ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处: 动态的增加和减少元素 实现了ICollection和ILis ...
- rem是怎么计算的(转载)
「rem」是指根元素(root element,html)的字体大小,从遥远的 IE6 到版本到 Chrome 他们都约好了,根元素默认的 font-size 都是 16px. rem是通过根元素进行 ...
- 15行python代码,帮你理解令牌桶算法
本文转载自: http://www.tuicool.com/articles/aEBNRnU 在网络中传输数据时,为了防止网络拥塞,需限制流出网络的流量,使流量以比较均匀的速度向外发送,令牌桶算法 ...
- HTML5+CSS3-学习总结
这是第三次学标签和样式了,虽然距离上次差不多2年.可学过的东西依旧还在. 体会 1. 相对于前端技术,基础还是很重要的. 2. 虽然很繁多.并不是杂乱无章的. 3. HTML5在新增的几个标签, ...
- shiroUtil工具类
package com.chabansheng.util; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.A ...
- vivado中如何使用chipscope
如何使用chipscope 参考: https://www.cnblogs.com/liujinggang/p/9813863.html Xilinx FPGA开发实用教程---徐文波 田耘 1.Ch ...
- nginx跨域问题记录
现象:访问 toolbox.chinasoft.com 提示如下:Access to Font at 'https://images.chinasoft.com/static-toolbox/styl ...