目录
- 一、上传文件
- 二、文件下载
一、上传文件
1.采用multipart格式上传文件
举例:
<form method="post" action="/common/upload" enctype="multipart/form-data"><input name="myFile" type="file" /><input type="submit" value="提交" /></form>
2.服务端接收上传的文件通常会用到Apache的两个组件
- commons-fileupload
- commons-io
Spring框架在spring-web包中对文件上传进行了封装,大大的简化了服务端代码,我们只需要在Controller的方法中声明一个MultipartFile类型的参数即可接受上传的文件。
代码如下:
@RestController
@RequestMapping("/common")
@Slf4j
public class CommonController {
//在application.yml配置文件中读取路径
@Value("${reggie_filePath.path}")
private String filePath;
@PostMapping("/upload")//文件上传,参数名必须与前端的name属性一直
public R<String> upload(MultipartFile file){
//file是一个临时文件,需要转存到指定位置
// log.info(file.toString());
//原始文件名
String originalFilename = file.getOriginalFilename();
//截取后缀名
String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
//使用UUID重新生成文件名,防止文件名重复发生文件覆盖
String fileName = UUID.randomUUID().toString() + suffix;
//创建一个目录对象
File dir = new File(filePath);
//判断目录是否存在
if (!dir.exists()) {
//不存在创建目录
dir.mkdirs();
}
try {
//将临时文件转存到指定位置
file.transferTo(new File(filePath+fileName));
}catch (IOException e){
e.printStackTrace();
}
return R.success(fileName);
}
}
二、文件下载
通过浏览器进行文件下载,本质上就是通过流的形式写回浏览器的过程,代码如下:
@RestController
@RequestMapping("/common")
@Slf4j
public class CommonController {
//在application.yml配置文件中读取路径
@Value("${reggie_filePath.path}")
private String filePath;
//文件下载
@GetMapping("/download")
public void download(String name, HttpServletResponse response) {
try {
//通过输入流读取文件内容
FileInputStream fis = new FileInputStream(filePath+name);
//通过输出流将文件内容写入到浏览器
ServletOutputStream outputStream = response.getOutputStream();
//设置响应的数据类型
response.setContentType("image/jpeg");
int len=0;
byte[] bytes = new byte[1024];
while ((len=fis.read(bytes))!=-1){
outputStream.write(bytes,0,len);
outputStream.flush();
}
//关闭资源
outputStream.close();
fis.close();
}catch (Exception e){
e.printStackTrace();
}
}
}