Springboot 一行代码实现文件上传 20个平台!少写代码到极致( 二 )


@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路径 。

Springboot 一行代码实现文件上传 20个平台!少写代码到极致

文章插图

Springboot 一行代码实现文件上传 20个平台!少写代码到极致

文章插图
不仅如此spring-file-storage还支持多种文件形式,URIURLStringbyte[]InputStreamMultipartFile,使开发更加灵活 。
Springboot 一行代码实现文件上传 20个平台!少写代码到极致

文章插图
文件上传功能,更多时候我们都是在上传图片,那就会有动态裁剪图片生成缩略图的需求,这些 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;}}

经验总结扩展阅读