网站上传图片、文件等,最常见的就是直接上传到服务器的webapp目录下,或者直接上传服务的一个指定的文件夹下面。这种方式对于简单的单机应用确实是很方便、简单,出现的问题也会比较少。但是对于分布式项目,直接上传到项目路径的方式显然是不可靠的,而且随着业务量的增加,文件也会增加,对服务器的压力自然就增加了。这里简单的介绍自己所了解的几种方式保存文件。
直接上传到指定的服务器路径;上传到第三方内容存储器,这里介绍将图片保存到七牛云自己搭建文件存储服务器,如:FastDFS最简单的上传首先说明,该项目结构是SpringBoot+mybatis。因为项目使用jar形式打包,所以这里将图片保存到一个指定的目录下。添加WebAppConfig配置类
@Configurationpublic class WebAppConfig extends WebMvcConfigurerAdapter{/** * 在配置文件中配置的文件保存路径 */@Value("${img.location}")private String location;@Beanpublic MultipartConfigElement multipartConfigElement(){MultipartConfigFactory factory = new MultipartConfigFactory();//文件最大KB,MBfactory.setMaxFileSize("2MB");//设置总上传数据总大小factory.setMaxRequestSize("10MB");return factory.createMultipartConfig();}}文件上传的方法,这个方法有些参数可能需要做简单的修改,大致就是文件先做文件保存路径的处理,然后保存文件到该路径,最后返回文件上传信息
@PutMapping("/article/img/upload")public MarkDVo uploadImg(@RequestParam("editormd-image-file") MultipartFile multipartFile) {if (multipartFile.isEmpty() || StringUtils.isBlank(multipartFile.getOriginalFilename())) {throw new BusinessException(ResultEnum.IMG_NOT_EMPTY);}String contentType = multipartFile.getContentType();if (!contentType.contains("")) {throw new BusinessException(ResultEnum.IMG_FORMAT_ERROR);}String root_fileName = multipartFile.getOriginalFilename();logger.info("上传图片:name={},type={}", root_fileName, contentType);//处理图片User currentUser = userService.getCurrentUser();//获取路径String return_path = ImageUtil.getFilePath(currentUser);String filePath = location + return_path;logger.info("图片保存路径={}", filePath);String file_name = null;try {file_name = ImageUtil.saveImg(multipartFile, filePath);MarkDVo markDVo = new MarkDVo();markDVo.setSuccess(0);if(StringUtils.isNotBlank(file_name)){markDVo.setSuccess(1);markDVo.setMessage("上传成功");markDVo.setUrl(return_path+File.separator+file_name);markDVo.setCallback(callback);}logger.info("返回值:{}",markDVo);return markDVo;} catch (IOException e) {throw new BusinessException(ResultEnum.SAVE_IMG_ERROE);}}文件保存类
/** * 保存文件,直接以multipartFile形式 * @param multipartFile * @param path 文件保存绝对路径 * @return 返回文件名 * @throws IOException */public static String saveImg(MultipartFile multipartFile,String path) throws IOException {File file = new File(path);if (!file.exists()) {file.mkdirs();}FileInputStream fileInputStream = (FileInputStream) multipartFile.getInputStream();String fileName = Constants.getUUID() + ".png";BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(path + File.separator + fileName));byte[] bs = new byte[1024];int len;while ((len = fileInputStream.read(bs)) != -1) {bos.write(bs, 0, len);}bos.flush();bos.close();return fileName;}配置文件保存路径测试:直接使用postman上传下面需要访问预览该上传的图片在配置文件中添加对静态资源的配置。SpringBoot对静态的的处理,Springboot 之 静态资源路径配置然后在浏览器