目录

  • 一、上传文件
  • 二、文件下载


一、上传文件

1.采用multipart格式上传文件
举例:

<form method="post" action="/common/upload" enctype="multipart/form-data"><input name="myFile" type="file" /><input type="submit" value="提交" /></form>

2.服务端接收上传的文件通常会用到Apache的两个组件

  • commons-fileupload
  • commons-io
    Spring框架在spring-web包中对文件上传进行了封装,大大的简化了服务端代码,我们只需要在Controller的方法中声明一个MultipartFile类型的参数即可接受上传的文件。
    代码如下:
@RestController
@RequestMapping("/common")
@Slf4j
public class CommonController {
	//在application.yml配置文件中读取路径
    @Value("${reggie_filePath.path}")
    private String filePath;
    @PostMapping("/upload")//文件上传,参数名必须与前端的name属性一直
    public R<String> upload(MultipartFile file){
        //file是一个临时文件,需要转存到指定位置
//        log.info(file.toString());
        //原始文件名
        String originalFilename = file.getOriginalFilename();
        //截取后缀名
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        //使用UUID重新生成文件名,防止文件名重复发生文件覆盖
        String fileName = UUID.randomUUID().toString() + suffix;
        //创建一个目录对象
        File dir = new File(filePath);
        //判断目录是否存在
        if (!dir.exists()) {
            //不存在创建目录
            dir.mkdirs();
        }
        try {
            //将临时文件转存到指定位置
            file.transferTo(new File(filePath+fileName));
        }catch (IOException e){
            e.printStackTrace();
        }
        return R.success(fileName);
    }
}

二、文件下载

通过浏览器进行文件下载,本质上就是通过流的形式写回浏览器的过程,代码如下:

@RestController
@RequestMapping("/common")
@Slf4j
public class CommonController {
	//在application.yml配置文件中读取路径
    @Value("${reggie_filePath.path}")
    private String filePath;
    //文件下载
    @GetMapping("/download")
    public void download(String name, HttpServletResponse response) {
        try {
            //通过输入流读取文件内容
            FileInputStream fis = new FileInputStream(filePath+name);
            //通过输出流将文件内容写入到浏览器
            ServletOutputStream outputStream = response.getOutputStream();
            //设置响应的数据类型
            response.setContentType("image/jpeg");
            int len=0;
            byte[] bytes = new byte[1024];
            while ((len=fis.read(bytes))!=-1){
                outputStream.write(bytes,0,len);
                outputStream.flush();
            }
            //关闭资源
            outputStream.close();
            fis.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}