Spring boot的文件上传

2020-05-29 16:21:51 浏览数 (1)

前言

文件上传的功能,基本上在所有的企业级应用都会有,那么在一个前后端分离的架构中,文件上传的功能又是如何去实现的呢。一般前端采用的是单页面应用,不会发生刷新和表单的提交,大部分都是异步完成的,他提交文件的时候,只是提交一个文件的路径上来。

文件上传测试用例

代码语言:javascript复制
  @Test
  public void whenUploadSuccess() throws Exception {
      String result = mockMvc.perform(fileUpload("/file")
              .file(new MockMultipartFile("file", "test.txt", "multipart/form-data", "hello upload".getBytes("UTF-8"))))
              .andExpect(status().isOk())
              .andReturn().getResponse().getContentAsString();
      System.out.println(result);
  }

MockMultipartFile对象用来构建我们的文件以及文件上传的参数,第一个参数指定上传时参数的name,第二个参数指定上传的文件名字,第三个参数指定enctype类型,第四个参数就是上传的文件。

下面是我们文件上传的Controller:

代码语言:javascript复制
@RestController
@RequestMapping("/file")
public class FileController {

  // 放文件的路径
  private String folder = "E:\WorkSpace\security\security-demo\src\main\java\com\zhaohong\web\controller";

  @PostMapping
  public FileInfo upload(MultipartFile file) throws Exception {
    System.out.println(file.getName());
    System.out.println(file.getOriginalFilename());
    System.out.println(file.getSize());
    File localFile = new File(folder, new Date().getTime()   ".txt");
    // 把上传的文件写在本地
    file.transferTo(localFile);
        return new FileInfo(localFile.getAbsolutePath());
  }
 }

需要注意的是,以上是我们代码的方便,而在我们实际的开发中,通常把文件存在到云服务上面,如阿里云、青牛云。

文件下载测试用例

下面是根据文件id,下载文件的代码:

代码语言:javascript复制
  @GetMapping("/{id}")
  public void download(@PathVariable String id, HttpServletRequest request, HttpServletResponse response) throws Exception {

    try (InputStream inputStream = new FileInputStream(new File(folder, id   ".txt"));
        OutputStream outputStream = response.getOutputStream();) {

      response.setContentType("application/x-download");
      response.addHeader("Content-Disposition", "attachment;filename=test.txt");
      // commons-io包下的
      // 包输入流写入输出流
      IOUtils.copy(inputStream, outputStream);
      outputStream.flush();
    } 
  }

上面代码中把流的声明写在try的括号里面,他会在代码运行结束,自动帮我们关闭流,这是jdk1.7的特性。

到目前前为止。我们的文件上传下载已经讲完了,各位小伙伴们别忘了点关注哦。

0 人点赞