@RestControllerpublic class FileController {@Autowiredprivate FileStorageService fileStorageService;/*** 公众号:程序员小富* 上传文件*/@PostMapping(value = https://www.huyubaike.com/biancheng/{"/upload"})public Object upload(MultipartFile file) {FileInfo upload= fileStorageService.of(file).upload();return upload;}}
我们用postman
测试上传一张图片,看到图片已经成功传到了/tmp/Pictures
目录下,返回结果中包含了完整的访问文件的URL路径 。
文章插图
文章插图
不仅如此
spring-file-storage
还支持多种文件形式,URI
、URL
、String
、byte[]
、InputStream
、MultipartFile
,使开发更加灵活 。文章插图
文件上传功能,更多时候我们都是在上传图片,那就会有
动态裁剪图片
、生成缩略图
的需求,这些 spring-file-storage 都可以很容易实现 。/** * 公众号:程序员小富 * 上传图片裁剪大小并生成一张缩略图 */@PostMapping("/uploadThumbnail")public FileInfo uploadThumbnail(MultipartFile file) {return fileStorageService.of(file).image(img -> img.size(1000,1000))//将图片大小调整到 1000*1000.thumbnail(th -> th.size(200,200))//再生成一张 200*200 的缩略图.upload();}
而且我们还可以动态选择上传平台,配置文件中将所有平台开启,在实际使用中自由的选择 。/** * 公众号:程序员小富 * 上传文件到指定存储平台,成功返回文件信息 */@PostMapping("/upload-platform")public FileInfo uploadPlatform(MultipartFile file) {return fileStorageService.of(file).setPlatform("aliyun-oss")//使用指定的存储平台.upload();}
下载文件下载文件也同样的简单,可以直接根据文件url或者文件流下载 。/** * 公众号:程序员小富 * 下载文件 */@PostMapping("/download")public void download(MultipartFile file) {// 获取文件信息FileInfo fileInfo = fileStorageService.getFileInfoByUrl("http://file.abc.com/test/a.jpg");// 下载到文件fileStorageService.download(fileInfo).file("C:\\a.jpg");// 直接通过文件信息中的 url 下载,省去手动查询文件信息记录的过程fileStorageService.download("http://file.abc.com/test/a.jpg").file("C:\\a.jpg");// 下载缩略图fileStorageService.downloadTh(fileInfo).file("C:\\th.jpg");}
提供了监听下载进度的功能,可以清晰明了的掌握文件的下载情况 。// 下载文件 显示进度fileStorageService.download(fileInfo).setProgressMonitor(new ProgressListener() {@Overridepublic void start() {System.out.println("下载开始");}@Overridepublic void progress(long progressSize,long allSize) {System.out.println("已下载 " + progressSize + " 总大小" + allSize);}@Overridepublic void finish() {System.out.println("下载结束");}}).file("C:\\a.jpg");
文件存在、删除我们还可以根据文件的URL地址来判断文件是否存在、以及删除文件 。//直接通过文件信息中的 url 删除,省去手动查询文件信息记录的过程fileStorageService.delete("http://file.abc.com/test/a.jpg");
//直接通过文件信息中的 url 判断文件是否存在,省去手动查询文件信息记录的过程boolean exists2 = fileStorageService.exists("http://file.abc.com/test/a.jpg");
切面工具还提供了每种操作的切面,可以在每个动作的前后进行干预,比如打日志或者玩点花活,实现FileStorageAspect
类重写对应动作的xxxAround方法 。** * 使用切面打印文件上传和删除的日志 */@Slf4j@Componentpublic class LogFileStorageAspect implements FileStorageAspect {/*** 上传,成功返回文件信息,失败返回 null*/@Overridepublic FileInfo uploadAround(UploadAspectChain chain, FileInfo fileInfo, UploadPretreatment pre, FileStorage fileStorage, FileRecorder fileRecorder) {log.info("上传文件 before -> {}",fileInfo);fileInfo = chain.next(fileInfo,pre,fileStorage,fileRecorder);log.info("上传文件 after -> {}",fileInfo);return fileInfo;}}
经验总结扩展阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- SpringBoot内置工具类,告别瞎写工具类了
- 【高并发】深度解析ScheduledThreadPoolExecutor类的源代码
- 之四 2流高手速成记:SpringBoot整合redis及mongodb
- Springboot JSON 转换:Jackson篇
- SpringBoot整合ES+Kibana
- 前端图形:SVG与Canvas
- SpringBoot框架SpEL表达式注入漏洞复现与原理分析
- Typora设置代码块Mac风格三个圆点
- 手写自定义springboot-starter,感受框架的魅力和原理
- 一 JPA入门学习集合springboot