Spring Boot批量上传图片
技术概述
技术作用:用在批量上传多张图片到服务器。
学习原因:用户上传图片如果每次只允许单张上传,重复操作给用户体验感不好,需要支持批量上传图片。
技术难点:保存图片的路径、图片上传存在大小限制
技术详述
首先后端用一个MultipartFile数组来接收前端传来的图片数组,再调用图片工具类PictureUrlUtil循环写入图片,再将拼接后的路径写入数据库。
for (int i = 0; i < files.length; i++) {
String filePath = PathUtil.poccessPath(PictureUrlUtil.getFilePath(files[i]),userId);
PictureUrlUtil.writePicture(files[i],filePath,clothingPath); //将图片输出到clothingPic文件夹
MattingUtil.getImage("/outfits/" +clothingPath+"/"+filePath);
int subtypeId = subtypeIdArray.getInteger(i);
filePath = filePath.replace(".jpg",".png");
wardrobeDao.importPic(filePath, userId, subtypeId);
}
路径拼接在多处需要复用,而且写的时候很容易错,所以写成一个路径工具类,用以生成路径。在Linux系统上路径全为正斜杠。服务器上需要建三个文件夹用于存放用户头像图片、衣物图片、博客图片。
/**
* 将图片输出到与项目同一级的文件夹下
* @param file 图片
* @param fileFolderName 文件夹名称
*/
public static void writePicture(MultipartFile file,String fileName,String fileFolderName){
try{
FileOutputStream picOutput = new FileOutputStream("/outfits/" + fileFolderName + "/" + fileName); //设置文件路径
picOutput.write(file.getBytes()); //获取字节流直接写入到磁盘内
picOutput.close();
}
catch (Exception e){
}
}
/**
* 获取图片本地路径
* @param multipartFile 图片名称
* @return
*/
public static String getFilePath(MultipartFile multipartFile){
String realfilePath = "";
try{
realfilePath += multipartFile.getOriginalFilename();
}
catch (Exception e){}
return realfilePath;
}
由于还实现了抠图,所以最后插入数据库的是抠过的图的路径。用户上传衣物流程如下:
技术难题与解决过程
技术难题在于上传多张图片时会失败。最开始根据报错在网上找了很多方法都没有解决,经过多次上传不同个数、不同类型的图片,发现规律:只上传不大于1MB的图片会成功;如果传多张图片,基本只能上传成功一张。再查资料发现因为springboot默认最大支持上传1MB以下的文件,需要对框架进行配置。
解决方法为在resources文件夹下的application.properties中添加以下内容:
spring.servlet.multipart.enabled =true
spring.servlet.multipart.file-size-threshold =0
spring.servlet.multipart.maxFileSize=500MB
spring.servlet.multipart.maxRequestSize=500MB
multipart.enabled =true 表示允许文件上传
multipart.file-size-threshold =0 表示支持文件写入磁盘
multipart.maxFileSize=500MB 表示最大支持文件大小为500MB
multipart.maxRequestSize=500MB 表示最大支持请求大小
总结
实现起来本身不难,但是会有一些bug和难以注意到细节。手工测试会比较慢,而且覆盖不全面,借助自动化测试就能提高效率,较快地解决问题。
springboot框架本身通过注释和一些封装的方法就能够简化代码,并且集成了ssm,配置简单。尤其时DAO层的代码优化后,维护起来方便很多,不然会显得对数据库的操作变得臃肿。后期学有余力应该要阅读springboot源码,可以在学会使用的基础上优化框架的性能。