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源码,可以在学会使用的基础上优化框架的性能。

参考博客

使用Spring Boot上传文件

posted @ 2021-06-28 16:38  SakuChyan  阅读(2445)  评论(0编辑  收藏  举报
/*以下是点击彩蛋特效*/