springboot集成mysql数据库实现文件上传下载

引入依赖

引入swagger依赖 方便接口调试 

        
		
			io.springfox
			springfox-swagger2
			2.9.2
		
		
			io.springfox
			springfox-swagger-ui
			2.9.2
		

 相关类

1、文件实体类

@Data
@Table(name = "upload_local_file")
@Entity
public class UploadLocalFile {

    @ApiModelProperty
    @Id
    private Long id;

    @ApiModelProperty("文件名称")
    private String fileName;

    @ApiModelProperty("原始文件名")
    private String originalName;
    
    @ApiModelProperty("扩展名")
    private String extensionName;
    
    @ApiModelProperty("访问地址 相对地址")
    private String url;
}

2、jpa接口类

public interface UploadLocalFileRepository extends JpaRepository{

}

文件上传

  • controller
    @ApiOperation(value = "文件上传", notes = "文件上传")
    @PostMapping("/upload")
    public ResponseEntity fileUpload(@RequestParam("file") MultipartFile file) {
        try {
            UploadFile uploadFile = uploadFileService.fileUpload(file);
            return ResponseEntity.ok().body(uploadFile);
        } catch (Exception e) {
            log.error(String.valueOf(e.getStackTrace()));
            return ResponseEntity.badRequest().body(null);
        }
    }
  • service
    @Autowired
    UploadLocalFileRepository uploadLocalFileRepository;

    @Value("${file.dir}")
    private String dirUrl;

    @Value("${file.base-url}")
    private String baseUrl;

    /**
     * 上传文件
     *
     * @param file
     * @return
     */
    public UploadFile fileUpload(MultipartFile file) throws IOException {

        InputStream inputStream = file.getInputStream();

        String originalFilename = file.getOriginalFilename();
        long id = System.currentTimeMillis();
        String extensionName = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
        String fileName = id + "." + extensionName;

        saveToDisk(inputStream, originalFilename);
        inputStream.close();

        UploadLocalFile uploadLocalFile = new UploadLocalFile();
        uploadLocalFile.setId(id);
        uploadLocalFile.setExtensionName(extensionName);
        uploadLocalFile.setOriginalName(originalFilename);
        uploadLocalFile.setFileName(fileName);
        uploadLocalFile.setUrl(baseUrl+"/"+id);
        UploadLocalFile save = uploadLocalFileRepository.save(uploadLocalFile);

        UploadFile uploadFile = new UploadFile();
        BeanUtils.copyProperties(save, uploadFile);
        return uploadFile;
    }

    /**
     * 保存文件到本地
     *
     * @param inputStream
     * @param fileName
     * @throws IOException
     */
    public void saveToDisk(InputStream inputStream, String fileName) throws IOException {

        FileOutputStream outputStream = null;
        try {
            File file = new File(dirUrl);
            if (!file.exists()) {
                file.mkdirs();
            }
            outputStream = new FileOutputStream(dirUrl + "/" + fileName);
            byte[] bytes = new byte[1024];
            int b;
            while ((b = inputStream.read(bytes)) != -1) {
                outputStream.write(bytes, 0, b);
            }
        } catch (Exception e) {
            log.error(e.getStackTrace().toString());
        } finally {
            if (outputStream != null) {
                outputStream.close();
            }
        }

    }
  •  application.yml
file:
  dir: d:/
  base-url: http://127.0.0.1:8009/api/uploadFileController/getFileStreamById

dir:上传的文件保存到服务器本地地址 

base-url:http文件下载路径接口地址

  • swagger接口测试

springboot集成mysql数据库实现文件上传下载_第1张图片 

  •  数据库存储数据格式

同时本地指定路劲下也保存了文件 

文件下载 

  •  controller
    @ApiOperation(value = "根据文件id下载文件",notes = "根据文件id下载文件")
    @GetMapping("/getFileStreamById/{fileId}")
    public void getFileStreamById(@PathVariable Long fileId, HttpServletResponse httpServletResponse){
        UploadLocalFile byId = uploadLocalFileRepository.findById(fileId).get();
        File file = new File(dirUrl+"/"+byId.getFileName());
        ServletOutputStream fileOutputStream = null;
        FileInputStream inputStream = null;

        httpServletResponse.setContentType("multipart/form-data");
        try {
            httpServletResponse.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(byId.getFileName(), "utf-8"));
        } catch (Exception ex) {
            log.error(ex.getMessage(), ex);
        }
        try {
            inputStream = new FileInputStream(file);
            fileOutputStream = httpServletResponse.getOutputStream();
            byte[] bytes = new byte[1024];
            int b;
            while((b=inputStream.read(bytes))!= -1){
                fileOutputStream.write(bytes,0,b);
            }
            fileOutputStream.flush();
        }catch (IOException e){
            log.error(e.getStackTrace().toString());
        }finally {
            try {
                if(inputStream != null){
                    inputStream.close();
                }
                if(fileOutputStream != null){
                    fileOutputStream.close();
                }
            }catch (IOException e){
                log.error(e.getStackTrace().toString());
            }

        }

    }

文件下载响应头的设置

content-type 指示响应内容的格式

content-disposition 指示如何处理响应内容。

一般有两种方式:

  • inline:直接在页面显示
  • attchment:以附件形式下载

 

 根据文件id 下载文件  同理根据文件名称也可以匹配下载

  • swagger测试

springboot集成mysql数据库实现文件上传下载_第2张图片 

你可能感兴趣的:(springboot)