欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringBoot如何实现文件上传和下载

程序员文章站 2022-04-30 23:06:02
...

文件上传

其实文件上传无非就是文件的读取和写入,明白这个道理之后就好办了。
前端页面

<form method="POST" action="/fileUpload" enctype="multipart/form-data">
    <input type="file" id="myFile" name="myFile" /><br/>
    <input type="submit"  value="Submit" />
</form>

这里需要注意的就是表单的enctype属性值必须设置为multipart/form-data
后端Controller

public static final String FILEPATH="E://wunian/test.txt";

@PostMapping("/fileUpload")
public @ResponseBody String fileUpload(@RequestParam("myFile")MultipartFile file){
 
    //判断文件是否为空
    if(file.isEmpty()){
       return "请不要上传空文件!";
    }
    try{
        //获得文件的字节流
        byte[] bytes=file.getBytes();
        //获得文件保存的路径对象
        Path path= Paths.get(FILEPATH+file.getOriginalFilename());
        //将文件写入到目标路径中
        Files.write(path,bytes);
        return "文件上传成功!";
    }catch (IOException e){
        e.printStackTrace();
    }
    return "文件上传失败!";
}

从上面代码中可以看出,我们只需要将上传文件的类型定义成MultipartFile对象即可传入,然后通过一些文件操作API读取文件数据再写入到目标路径即可。

文件下载

前端页面

<a href="/download">立即下载</a>

后端Controller

public static final String FILEPATH="E://wunian/test.txt";

@RequestMapping(value="/download",method = RequestMethod.GET)
public void download( HttpServletResponse response){
  //下载文件名
  String fileName="test.txt";
  //通过文件的保存文件夹路径加上文件的名字来获得文件
  File file=new File(FILEPATH,fileName);

  if(file.exists()){  //判断文件是否存在
    //设置响应的内容格式,force-download表示只要点击下载按钮就会自动下载文件
    response.setContentType("application/force-download");
    //设置头信息,filename表示前端下载时的文件名
    response.addHeader("Content-Disposition",String.format("attachment; filename=\"%s\"", file.getName()));
    //进行读写操作
    byte[] buffer=new byte[1024];
    FileInputStream fileInputStream=null;
    BufferedInputStream bufferedInputStream=null;
    try{
      fileInputStream=new FileInputStream(file);
      bufferedInputStream=new BufferedInputStream(fileInputStream);
      //获取输出流
      OutputStream os=response.getOutputStream();
      //读取并且写入文件到输出流
      int i=bufferedInputStream.read(buffer);
      while(i!=-1){
        os.write(buffer,0,i);
        i=bufferedInputStream.read(buffer);
      }
    }catch (IOException e){
      e.printStackTrace();
    }finally {
      //关闭输入输出流
      try {
        if(bufferedInputStream!=null){
          bis.close();
        }
        if(fileInputStream!=null){
          fileInputStream.close();
        }
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
}

从上面代码中可以看出,下载和上传一样,本质上也是流的输入输出,不过不同的是下载需要设置response的头信息和内容格式,而且头信息一般设置为Content-Disposition=attachment; filename=xxx