**前言:**首先这只是一个简单的本地上传和下载文件,项目中上传和下载文件更为复杂。但是对于上传和下载的步骤,以及涉及到文件流的传输大致都是一样的;既然是文件的传输,肯定是要弄明白IO流的(字符流,字节流,输入输出流…)推荐一篇非常详解的IO流的介绍:
https://blog.csdn.net/mu_wind/article/details/108674284
文件上传1.前端通过post请求,请求头的content-type为multipart/form-data,将文件发送到后台;
2.后台使用MultipartFile类型的file作为参数来接受文件;
这是MultipatyFile类的所有方法,它继承了InputStreamSource;
通过file.getOriginalFilename()获取到文件名+文件类型,
通过file.getInputStream()获取到文件的输入流,
通过file.transferTo(Path)将文件上传到指定位置;
这样一看,好像对于文件的上传,通过调用MultipartFile类几个方法就可以完成了;
@PostMapping("/upload")
public HashMap fileUpload(MultipartFile file, HttpServletRequest request){
HashMap result = new HashMap<>();
if (file.isEmpty()){
System.out.println("文件为空...");
}
String originalFilename = file.getOriginalFilename();
log.info("文件名:----> "+originalFilename);
String fileType = originalFilename.substring(originalFilename.lastIndexOf("."));
log.info("文件类型:----> "+fileType);
String format = new SimpleDateFormat("/yyyy/MM/dd/").format(new Date());
//上传到的路径
String realPath = "D://data//"+format;
File folder = new File(realPath);
log.info("文件的上传路径:----> "+folder);
if (!folder.exists()) {
folder.mkdirs();
}
String newName = UUID.randomUUID() + fileType;
//通过一个路径和文件名创建一个新文件实例,将文件上传到新文件的位置
File newFile = new File(folder,newName);
try {
file.transferTo(newFile);
result.put("status","success!!!");
log.info("文件上传成功 ---> success");
} catch (IOException e) {
e.printStackTrace();
result.put("status","error!!!");
result.put("msg",e.getMessage());
log.info("文件上传失败 ---> "+e.getMessage());
}
return result;
}
其实除了通过file.tansferTo()方法上传文件,我们还可以自己将文件转为输出流写到指定的位置;也就是将
file.transferTo(newFile);
替换成
OutputStream out = new FileOutputStream(newFile); out.write(bytes);文件下载
对于简单的通过发送请求去下载指定文件过程,我们只需要将要下载的文件转换成流封装到响应体中即可。
@GetMapping("/download")
public ResponseEntity download() throws IOException {
FileSystemResource file = new FileSystemResource("D:\data\2021\11\15\fb76855f-e5c7-47b9-82c5-8ad3b94f663e.md");
HttpHeaders headers = new HttpHeaders();
String fileName = file.getFilename();
log.info("下载的文件名:"+fileName);
headers.add("Content-Disposition","attachment;filename="+fileName);
return ResponseEntity.ok()
.headers(headers)
.contentLength(file.contentLength())
.contentType(MediaType.parseMediaType("application/octet-stream"))
.body(file);
}
这里的文件下载,主要就是要了解对象http响应头和响应体的一个封装,还有对于Resource实现类的理解。
后端主要代码就这些啦,还有就是我们可以在配置文件中指定文件的大小等
上传下载文件的步骤流程很少,最重要的是学好IO流,还有就是multipartFile类和http响应体的封装;
强烈建议抽出时间看一下上面推荐IO流的介绍;(也是说给我自己听的…)
下一篇:暂时先准备springboot自动配置原理,这个有点难搞,先慢慢看,再不断补充;因为感觉很多springboot东西又整不明白了



