Springboot 之文件上传下载

JAVA SpringBoot学习之文件上传下载

客户端的图片下载分为两种,一种是以流的方式,一种是直接给个url地址进行展示。这里分别以两种方式记录,文件的上传下载

文件上传:

application.yml配置地址

fileConf:
	savePath: C:\workspace\pragrammerFile\
    visitPath: http://localhost:8760/

controller 部分:

  @Autowired
  FileService fileService;
  @Value("${fileConf.savePath}")
  private String fileSavePath;

  @Value("${fileConf.visitPath}")
  private String fileVisitPath;


@PostMapping("upload")
    public Json  upload(Long id,String type,String description,HttpServletRequest request) {
        Json json=Json.buildSuccessResult();
        try {
            MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
            MultipartFile multipartFile=multipartRequest.getFile("file");
            String contentType = multipartFile.getContentType();  //文件类型
            String fileName = multipartFile.getOriginalFilename(); //名字
            String fileSuffix = fileName.substring(
                    fileName.lastIndexOf("."), fileName.length());
            UUID uuid = UUID.randomUUID();
            File savePath=new File(fileSavePath);//创建文件夹
            if (!savePath.exists()) {
                savePath.mkdirs();
            }
            String uuidFileName = uuid.toString() + fileSuffix;
            File file=new File(fileSavePath,uuidFileName);//拼接文件路径
            multipartFile.transferTo(file);//保存到本地,其实transferTo底层依然使用的是IO流操作的,这里自己写io也可以
            FileEntity fileEntity=new FileEntity();
            fileEntity.setFileDescription(description);
            fileEntity.setFileName(fileName);
            fileEntity.setSize(FileUtils.getFileSize(multipartFile));
            fileEntity.setFileType(contentType);
            fileEntity.setPath(uuidFileName);
            fileEntity.setUrl(fileVisitPath);
            fileEntity.setModelId(id);
            fileEntity.setModelType(type);
            fileService.saveFile(fileEntity);
        } catch (Exception e) {
            json.buildErrorResponse(ApplicationResponseCode.FAIL,e.getMessage());
        }
        return json;
   }

web端上传文件,我这里需要额外的参数id,type,description,所以要封装到FormData中进行传递

 let uploadData = new FormData();
      uploadData.append("file", file);
      uploadData.append("id", "12");
      uploadData.append("type", "News");
      uploadData.append("description", file.name);
      this.$putUploadFiles(uploadData, "/api/FileEntity/upload").then(
        response => {
          this.$success("上传成功");
      }
 );

下载文件
1.返回IO流

	if (fileName == null) {
            throw new BusinessException("1001", "文件名不能为空");
        }
 
        // 通过文件名查找文件信息
        FileInfo fileInfo = fileInfoDao.findByFileName(fileName);
        log.info("fileInfo-->{}", fileInfo);
        if (fileInfo == null) {
            throw new BusinessException("2001", "文件名不存在");
        }
 
        //设置响应头
        res.setContentType("application/force-download");// 设置强制下载不打开
        res.addHeader("Content-Disposition", "attachment;fileName=" +
                new String(fileInfo.getFileOriginName().getBytes("gbk"), "iso8859-1"));// 设置文件名
        res.setHeader("Context-Type", "application/xmsdownload");
 
        //判断文件是否存在
        File file = new File(Paths.get(fileInfo.getFilePath(), fileName).toString());
        if (file.exists()) {
            byte[] buffer = new byte[1024];
            FileInputStream fis = null;
            BufferedInputStream bis = null;
            try {
                fis = new FileInputStream(file);
                bis = new BufferedInputStream(fis);
                OutputStream os = res.getOutputStream();
                int i = bis.read(buffer);
                while (i != -1) {
                    os.write(buffer, 0, i);
                    i = bis.read(buffer);
                }
                log.info("下载成功");
            } catch (Exception e) {
                e.printStackTrace();
                throw new BusinessException("9999", e.getMessage());
            } finally {
                if (bis != null) {
                    try {
                        bis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (fis != null) {
                    try {
                        fis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }

2.直接返回url,
一般来说,想一些客户端,除非是一些非图片类型,一般是直接返回url的
第一步配置WebMvcConfigurer,

@Configuration
public class MyWebMvcConfigurerAdapter implements WebMvcConfigurer {
    private String fileSavePath="file:C:/workspace/pragrammerFile/";
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //指向外部目录
        registry.addResourceHandler("img/**").addResourceLocations(fileSavePath);
    }
}

其中fileSavePath:C:\workspace\pragrammerFile
而img就是虚拟的映射fileSavePat文件夹,所以最后完整地址就是
ip/img/文件名,
所以后端返回前端完整url即可,或者返回img/文件名,前端自己拼接

示例:
这里上传一张如下图片:
Springboot 之文件上传下载

Springboot 之文件上传下载
数据库:这里看到数据记录已经插入到文件表中。
Springboot 之文件上传下载
接下来就去看C:\workspace\pragrammerFile\有没有文件生成
Springboot 之文件上传下载
可以看到生成了文件。
下面直接在浏览器通过url+img/文件名去访问该图片,可以访问啦~
Springboot 之文件上传下载