前言
文件上传的功能,基本上在所有的企业级应用都会有,那么在一个前后端分离的架构中,文件上传的功能又是如何去实现的呢。一般前端采用的是单页面应用,不会发生刷新和表单的提交,大部分都是异步完成的,他提交文件的时候,只是提交一个文件的路径上来。
文件上传测试用例
代码语言: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的特性。
到目前前为止。我们的文件上传下载已经讲完了,各位小伙伴们别忘了点关注哦。