• Spring Boot 文章多图上传


    一、技术概述

    在Spring Boot项目中使用单图或多图上传功能。适用于项目中头像上传、文章多图上传等功能。

    二、技术详述

    以新增文章的功能为例,新增文章时不仅需要文章标题、内容等信息,还需要多张图片信息。

    1. 数据库实现

    由于一篇文章对应多张图片,属一对多关系,因此在文章表之外还要额外创建一张文章图片表用以存放。字段设计为 图片id文章id图片地址

    1. 创建Controller
    @RestController
    public class ArticleController {
    
        @Autowired
        private ArticleService articleService;
    
        @PostMapping(value = "/article")
        public JSONObject addArticle(@RequestParam("title") String title, @RequestParam("imgs") MultipartFile[] imgs) {
            return articleService.addArticle(title, imgs);
        }
    
    }
    

    在Controller中我们使用 MultipartFile[] 这个类型来接收图片文件,使用Post方式,Content-Typemultipart/form-data

    1. 创建articleServiceImpl实现
    @Service("articleService")
    public class ArticleServiceImpl implements ArticleService {
    
        @Autowired
        private ArticleDAO articleDAO;
    
        @Autowired
        private ArticlePictureDAO articlePictureDAO;
    
        @Value("${uploadPath}")
        private String uploadPath;
    
        public JSONObject addArticle(String title, MultipartFile[] imgs) {
            //添加文章
            ArticleEntity articleEntity = new ArticleEntity();
            articleEntity.setTitle(title);
            articleEntity = articleDAO.save(articleEntity);
            //上传图片
            if (imgs != null && imgs.length >= 1) {
                for (MultipartFile aimg : imgs) {
                    String fileName = aimg.getOriginalFilename();  // 文件名
                    String suffixName = fileName.substring(fileName.lastIndexOf("."));  // 后缀名
                    if(!suffixName.equals(".jpg") && !suffixName.equals(".png")){  // 用以判断文件类型
                        System.out.println("文件类型错误!");
                        continue;
                    }
                    String filePath = uploadPath;  // 上传后的路径
                    fileName = java.util.UUID.randomUUID() + suffixName;  // 新文件名
                    File dest = new File(filePath + fileName);
                    if (!dest.getParentFile().exists()) {  // 不存在目录则创建
                        dest.getParentFile().mkdirs();
                    }
                    try {
                        aimg.transferTo(dest);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    String filename = articlePicturePath + fileName;
                    ArticlePictureEntity articlePictureEntity = new ArticlePictureEntity();
                    articlePictureEntity.setAid(articleEntity.getId());
                    articlePictureEntity.setPath(filename);
                    articlePictureDAO.save(articlePictureEntity);
                }
            }
            ...
        }
    }
    

    用较为简单的java.util.UUID来进行文件命名,可以自己定义修改。

    1. 自定义图片上传路径

    application.properties:

        uploadPath=/home/web/apache-tomcat-9.0.33/webapps/img/
    

    articleServiceImpl.java:

        @Value("${uploadPath}")
        private String uploadPath;
    

    在Spring Boot配置文件application.properties中配置一个变量来使用方便日后修改。

    三、问题与解决

    1. 图片上传路径问题
      在windows上测试上传路径时要注意java和路径中的“”和“/”的问题(参考博客:路径和JAVA中的 "" 和 "/" 有什么区别)。在windows下测试完要部署至linux服务器时要注意更改路径至linux服务器的路径。在application.properties中配置路径可以免去更改路径的烦恼(其他变量也是如此)。

    2. 单图与多图问题
      不论是单图上传还是多图上传,都可以用MultipartFile类型。上面的例子用的是多图上传,单图上传把类型改为MultipartFile[]或把数量限制为1即可。

    3. 前后端对接问题
      使用Post方式,Content-Type为multipart/form-data。一些判断文件是否为图片等的判断可与前端交流更改。

    四、总结

    Spring boot的图片上传较为简单,使用MultipartFile就可以轻松实现,同时也不只局限于图片的上传,其他文件的上传也是同样的道理。

    五、参考博客

    springBoot+jpa实现图片上传功能,使用MultipartFile接口实现 by ¥诸葛村夫¥
    Springboot 将前端传递的图片上传至Linux服务器并返回图片的url(附源码)by Wyx_
    SpringBoot 上传图片接口 by 网络改变中国

  • 相关阅读:
    Windows Azure 基本操作手册
    如何通过Visual Studio发布Azure应用程序
    Windows Azure的故障检测和重试逻辑
    如何在Azure上动态配置IP地址
    vue2.0像子组件传递新数据(插槽)
    iview admin 动态加载左侧菜单栏?
    iViewadmin数据请求跨域处理
    angular4的多环境(测试环境与开发环境,生产环境)
    页面编译,及部署
    resolve守卫
  • 原文地址:https://www.cnblogs.com/hujh/p/13188540.html
Copyright © 2020-2023  润新知