1、文件上传(upload)
文件上传,也称为upload,是指将本地图片、视频、音频等文件上传到服务器上,可以供其他用户浏览或下载的过程。文件上传在项目中应用非常广泛,我们经常发微博、发微信朋友圈都用到了文件上传功能。
1.1 文件上传时,对页面的form表单有如下要求:
method="post" | 采用post方式提交数据 |
enctype="multipart/form-data" | 采用multipart格式上传文件 |
type="file" | 使用input的file控件上传 |
1.2 举例:
<form method="post" action="/common/upload" enctype="multipart/form-data">
<input name="myFile" type="file" />
<input type="submit" value="提交" />
</form>
1.3 服务端要接收客户端页面上传的文件,通常都会使用Apache的两个组件:
<1> commos-fileupload
<2> commos-io
底层还是基于上面两个组件,Spring框架在spring-web包中对文件上传进行了封装,大大简化了服务端代码,我们只需要在Controller的方法中声明一个MultipartFile类型的参数即可接收上传的文件,例如:
/**
* application.yml文件中配置了文件存放路径
mydir:
path: D:\img\
* */
@Value("${mydir.path}")
private String basePath;
/**
* 文件上传
* */
@PostMapping("/upload")
public R<String> upload(MultipartFile file) {
//file是一个临时文件,需要转存到指定位置,否则本次请求完成后临时文件会删除
log.info(file.toString());
//原始文件名
String originalFilename = file.getOriginalFilename();//如abc.jpg
//获取文件后缀如.jpg
String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
//使用UUID重新生成文件名,防止文件名称重复造成文件覆盖
String fileName = UUID.randomUUID().toString()+suffix;//如dfsgkbdabc.jpg
//创建一个目录对象
File dir = new File(basePath); // D:\img\
//判断当前目录是否存在
if (!dir.exists()){
//目录不存在,需要创建
dir.mkdirs();
}
try {
//将临时文件转存到指定位置
file.transferTo(new File(basePath+fileName));
} catch (IOException e) {
e.printStackTrace();
}
return R.success(fileName);
}
2、文件下载(download)
文件下载,也称为download,是指将文件从服务器传输到本地计算机的过程。
2.1 通过浏览器进行文件下载,通常有两种表现形式:
<1> 以附件形式下载,弹出保存对话框,将文件保存到指定磁盘目录
<2> 直接在浏览器中打开
通过浏览器进行文件下载,本质上就是服务端将文件以流的形式写回浏览器的过程。
2.2 文件下载,如下代码举例:
<!-- 文件下载,页面可以使用<img>标签展示下载的图片 -->
<img v-if="imageUrl" :src="imageUrl" class="avatar"></img>
//发请求
downloadAvatarSuccess (response){
this.imgeUrl = this.imageUrl = `/download?name=${response.data}`
}
/**
* 文件下载
* */
@GetMapping("/download")
public void download(String name, HttpServletResponse response){
try {
//输入流,通过输入流读取文件内容
//如 basePath+name 可为 D:\img\abdgfhxrg.jpg等
FileInputStream fileInputStream = new FileInputStream(new File(basePath+name));
//输出流,通过输出流将文件写回浏览器,在浏览器展示图片了
ServletOutputStream outputStream = response.getOutputStream();
//设置响应数据格式
response.setContentType("image/jpeg");
int len = 0;
byte[] bytes = new byte[1024];
//文件输入流读入bytes字节数组中
while ((len=fileInputStream.read(bytes)) != -1){
outputStream.write(bytes,0,len);
outputStream.flush();
}
//关闭资源
outputStream.close();
fileInputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}