适用场景: 网络绝对路径的URL文件或图片,不存储到本地,转换成stream,直接使用HTTPClient传送到SpringBoot的服务端,将文件存储下来,并返回一个文件地址。目前分层架构的系统越来越多这种需求,所以记录下来以备不时之需。
首先引入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);
}
}catch (Exception ex){
ex.printStackTrace();
}
}
}
服务端直接使用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
来自:https://www.cnblogs.com/tobeymarshall/p/10215101.html
PC端上传文件多半用插件,引入flash都没关系,但是移动端要是还用各种冗余的插件估计得被喷死,项目里面需要做图片上传的功能,既然H5已经有相关的接口且兼容性良好,当然优先考虑用H5来实现。
首先我们定义一个input标签type=file、然后我们定义一个jsReadFiles的方法将文件作为参数;当上传文件的时候读取这个文件。图片上传成功,只是图片路径变成了base64编码的形式。
HTML5读取文件主要利用的就是FileReader这个API,它的使用需要从一个构造函数开始,保存文件的关键是生成文件对象,可以使用URL.createObjectURL()方法实现,该方法能返回给定对象的URL,用在<a>标签的href属性上就可以创建可下载的文件链接。
在JavaScript文件中存储敏感数据,不仅是一种错误的实践方式,而且还是一种非常危险的行为,长期以来大家都知道这一点。
比如我写了一个JS文件,这个文件需要调用另外一个JS文件,该如何实现呢?这篇文章主要介绍:在js文件中引入另一个js文件的实现
最近有这样一个需求,就是在HTML页面中有个按钮导出,点击它,将构造一个文档并存储到本地文件系统中。另外还有个按钮,点击它,从本地文件系统中读取一个文件并对内容进行分析。
从 Yarn 横空出世推出 lock 文件以来,已经两年多时间了,npm 也在 5.0 版本加入了类似的功能,lock 文件越来越被开发者们接收和认可。本篇文章想从前端视角探讨一下我们为什么需要 lock 文件,以及它的一些成本与风险,当然其中一些观点对于后端也是适用的
什么是断点续传?就是下载文件时,不必重头开始下载,而是从指定的位置继续下载,这样的功能就叫做断点续传。前端通过FileList对象获取到相应的文件,按照指定的分割方式将大文件分段,然后一段一段地传给后端,后端再按顺序一段段将文件进行拼接。
form表单的enctype属性:规定了form表单数据在发送到服务器时候的编码方式.。application/x-www-form-urlencoded:默认编码方式,multipart/form-data:指定传输数据为二进制数据,例如图片、mp3、文件,text/plain:纯文本的传输。空格转换为“+”,但不支持特殊字符编码。
阿里云OSS创建存储空间Bucket(读写权限为:公共读),拿到相关配置创建 oss.php 上传类 (基于thinkPHP5),访问 oss域名地址 不可在浏览器直接访问 可用nginx 代理
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!