SpringBoot上传图片
目录
SpringBoot上传图片到服务器
技术概述
在我们的项目中,允许用户对当前停车状况提交反馈,然后反馈是支持提交图片的,因此需要上传图片的功能。
技术详述
-
本技术是基于SpringBoot实现的,所以首先应搭建好一个SpringBoot项目
-
首先是在SpringBoot的properties配置文件下设置两个变量路径,
path
表示的是你想要将文件实际存储的路径,url
表示的是用户通过url访问到的路径,具体的映射关系是在nginx的配置里设置的,其目的呢也是为了隐藏服务器上的真实文件路径upload.picture.path=/var/www/picture/ upload.picture.url=/pic/
-
然后是在Service层创建了一个
CONTENT_TYPE
数组,内容为允许接受的文件后缀名,还创建了一个Logger对象,用来记录上传文件过程中的错误。public interface FileService { List<String> CONTENT_TYPES = Arrays.asList("image/jpeg", "image/gif","image/jpg","image/png","image/svg"); Logger LOGGER = LoggerFactory.getLogger(FileService.class); /** * 上传图片 * @param file * @return 图片url */ String uploadPicture(MultipartFile file); }
-
接下来就是具体的业务层实现代码了。首先我们将配置文件中的两个路径引入
@Value("${upload.picture.path}") String filePath; @Value("${upload.picture.url}") String fileUrl;
-
我们从前端接收到的文件类型为MultipartFile,MultipartFile是spring类型,代表HTML中form-data方式上传的文件,包含二进制数据+文件名称。我们使用
getOriginalFilename()
方法和getContentType()
方法获取到文件的名称和文件的类型,并使用文件类型来和我们之前定义的类型数组中的允许的类型进行比对,如果上传文件的类型不存在类型数组中,则报错String originalFilename = file.getOriginalFilename(); // 校验文件的类型 String contentType = file.getContentType(); if (!CONTENT_TYPES.contains(contentType)){ // 文件类型不合法,直接返回null LOGGER.info("文件类型不合法:{}", originalFilename); return null; }
-
当然,只后缀名是完全不够的,这里我们就需要用到ImagIO和BufferedImage,使用ImagIO的
read
方法可以读入图片然后对图片进行一些操作,我们这不需要对图片进行操作,只需要判定它读入后是否为空就知道文件内容是否真的为图片// 校验文件的内容 BufferedImage bufferedImage = ImageIO.read(file.getInputStream()); if (bufferedImage == null){ LOGGER.info("文件内容不合法:{}", originalFilename); return null; }
-
最后就是对文件进行转存了,一般存储到服务器上的文件都是用统一的ID来进行存储管理而不是各种各样的文件名,因此这里使用了
java.util.UUID
//获取后缀名 assert originalFilename != null; String suffixName = originalFilename.substring(originalFilename.lastIndexOf(".")); //生成新文件名 String fileName = UUID.randomUUID() + suffixName; File dest = new File(filePath + fileName); if (!dest.getParentFile().exists()) { dest.getParentFile().mkdirs(); } // 保存到服务器 file.transferTo(dest); // 生成url地址,返回 return fileUrl+fileName;
遇到的问题和解决过程
问题:主要遇到的问题有两个吧,一个是代码是从上传文件的基础上改变而来的,因此对文件类型的筛选和验证就十分的重要,还有就是因为是将文件存于服务器上的,所以不可能将文件的真实路径展示,所以需要返回的是已经映射过后的url。
解决过程:上述的两个问题的解决已经在技术详述中表达出来了。
总结
通过SpringBoot上传图片总的来说是非常便捷的,通过Logger在Spring的后台也能够非常快速的发现文件的问题,对于我来说最大的收获也是通过上传图片的编写去了解到了有关于MultipartFile和ImageIO的知识。
参考文献
MultipartFile与File的一些事--sdut菜鸟