以下都是基于本机的文件上传和下载
文件上传也称为upload,是指将本地的图片视频等文件上传到服务器上,可以供其他用户浏览或下载的过程。
文件上传时,对页面的form表单有如下要求
文件上传
Spring框架在spring-web包中对文件上传进行了封装,简化啦代码,只需要在Controller的方法中声明一个 MultipartFile类型的参数即可接收上传的文件
/**
* 文件上传
* @param file
* @return
*/
@PostMapping("/upload")
public R<String> upload(MultipartFile file){
System.out.println(file);
return R.success(fileName);
}
下载介绍
文件下载称为download,将文件从服务器传输到本地计算机的过程,通过浏览器进行文件下载,有两种表现形式
1.以附件的形式下载,弹出保存对话框,将文件保存到指定磁盘mul
2.之间在浏览器中打开,本质上就是服务端将文件以流的形式写回到浏览器的过程
服务端实现上传功能:
1.需要在application.yml中定义文件存储路径
reggie:
path: D:\img\
2.CommonController
通过MultipartFile类型的参数接收傻狗奴才的文件,方法形参的名称需要与页面的file域的name属性一致
上传的逻辑:
1.获得文件的原始文件名,通过原始文件名获得文件后缀
2.通过UUID重新声明文件名,文件名重复造成文件覆盖
3.创建本机文件存放目录
4.将上传的临时文件转存到指定位置
(注意@Value的包不要导错)
import com.itheima.reggie.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.util.UUID;
/**
* 文件上传和下载
*/
@RestController
@RequestMapping("/common")
@Slf4j
public class CommonController {
@Value("${reggie.path}")
private String basePath;
/**
* 文件上传
* @param file
* @return
*/
@PostMapping("/upload")
public R<String> upload(MultipartFile file){
//file是一个临时文件,需要转存到指定位置,否则本次请求完成后临时文件会删除
log.info(file.toString());
//原始文件名
String originalFilename = file.getOriginalFilename();//abc.jpg
String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
//使用UUID重新生成文件名,防止文件名称重复造成文件覆盖
String fileName = UUID.randomUUID().toString() + suffix;//dfsdfdfd.jpg
//创建一个目录对象
File dir = new File(basePath);
//判断当前目录是否存在
if(!dir.exists()){
//目录不存在,需要创建
dir.mkdirs();
}
try {
//将临时文件转存到指定位置
file.transferTo(new File(basePath + fileName));
} catch (IOException e) {
e.printStackTrace();
}
return R.success(fileName);
}
}
在拦截器中释放common路径,在 LoginCheckFilter 的doFilter方法中
文件下载服务端:
逻辑如下:
1.定义输入流,通过输入流从指定位置读取文件内容
2.通过response对象,获取输出流
3.通过response对象设置响应数据格式(image/jped)
4.通过输入流读取文件数据,在通过上述的输出流写回浏览器
5.关闭资源
//http://localhost:8080/common/download?name=590417c9-2d46-411f-8045-7ffc5cdffede.jpg
//请求方法: GET 下载图片,在浏览器中显示图片
@GetMapping("/download")
public void download(String name, HttpServletResponse response) {
try {
//输入流,读取文件
FileInputStream fileInputStream = new FileInputStream(new File(basePaht + name));
//输出流 将文件写回浏览器中
ServletOutputStream outputStream = response.getOutputStream();
// 表明返回什么格式
response.setContentType("image/jpeg");
//输入流复制到输出流
byte[] bytes = new byte[1024];
//为-1表明读取结束
while (fileInputStream.read(bytes) != -1) {
outputStream.write(bytes);
outputStream.flush();
}
fileInputStream.close();
outputStream.close();
} catch (Exception e) {
log.error("download error", e);
}
}