1.文件上传
1.文件上传时,对页面的 form 表单有如下要求:
1.method = "post" 即采用 post 方式提交数据
2.enctype = "multipart/form-data" 即采用 multipart 格式上传文件
3.type = "file" 即使用 input 的 file 控件上传
示例:
<form method="post" action="" enctype="multipart/form-data">
<input name="" type="file" />
<input value="" type="submit" />
</form>
目前一些前端组件库也提供了相应的上传组件,但其底层原理还是基于form表单的文件上传
2.服务端接收客户端页面上传的文件,通常都会使用 Apache 的两个组件
1.commons-fileupload
2.commons-io
spring 框架在 spring-web 包中对文件上传进行了封装,大大简化了服务端代码,我们只需要在 Controller 方法中声明一个 MultipartFile 类型的参数即可,例如:
public R<String> upload(MultipartFile file){}
一次简单的完整的上传代码
@PostMapping("/upload")
public R<String> upload(MultipartFile file)
{
// file 是一个临时文件,需转存到指定位置,否则本次请求完成后临时文件会删除
// 原始文件名
String fileName = file.getOriginalFilename();
String suffix = fileName.substring(fileName.lastIndexOf("."));
// 使用 uuid 重新生成文件名,防止文件名重复造成文件覆盖
fileName = UUID.randomUUID().toString() + suffix;
File baseFile = new File(basePath);
if (!baseFile.exists())
baseFile.mkdirs();
// 将临时文件转存
try {
file.transferTo(new File(basePath + fileName));
} catch (IOException e) {
e.printStackTrace();
}
return R.success(fileName);
}
2.文件下载
通过浏览器进行文件下载,通常有两种表现形式:
1.以附件形式下载
2.直接在浏览器中打开
通过浏览器下载,本质上就是服务端将文件以流的形式写回浏览器的过程
一次简单的下载图片的代码:
@GetMapping("/download")
public void download(String name, HttpServletResponse response)
{
// 设置相应格式
response.setContentType("image/jpeg");
// 输入流,通过输入流读取文件内容
try {
FileInputStream fileInputStream = new FileInputStream(new File(basePath + name));
// 输出流,通过输出流将文件写回浏览器
ServletOutputStream outputStream = response.getOutputStream();
int len = 0;
byte[] b = new byte[1024];
while ((len = fileInputStream.read(b)) != -1)
{
outputStream.write(b, 0 ,len);
outputStream.flush();
}
outputStream.close();
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}