上传文件
原理:前端让用户选择一个文件,点击丢给后端上传,后端servlet接收到这些请求就进行应答构建连接,完了就开始接收。
但实现这些原理可以不是很懂。servlet封装了一下,spring boot也封装了一下。实现就比较简单。
实现过程:
- 确定下载的目标路径
- 转存就好了
/*** 输入这个类就是spring boot基于servlet进行封装,直接 写这个参数就可以接收* 但是这个参数名称file要与前端传入一致,否则应该要写别的注解* @param file* @return*/@PostMapping("/upload")public R<String> upload(MultipartFile file){log.info(file.toString());// 看一下输入的basePath是否建了目录// 否则不会自己建目录会报错File dir = new File(basePath);if (!dir.exists()){dir.mkdir();}String originPathName = file.getOriginalFilename();// 由于如果按照源文件名字保存,可能会重名,所以使用UUID进行编码然后保存// 拼接一下拓展名,就好了String suffix = originPathName.substring(originPathName.lastIndexOf("."));String prefix = UUID.randomUUID().toString();String fileName = prefix + suffix;try {// 最后调用transfer就可以转存了file.transferTo(new File(basePath + fileName));} catch (IOException e) {e.printStackTrace();}return R.success(fileName);}
下载文件
下载文件稍稍会复杂一些些,但其实也还好,就是用文件IO流就好了。
保存好的文件是保存在了服务端刚刚设置的文件夹下,拿着时候相对于服务端程序就是需要input一下,将upload的文件读入程序,然后再去找一个output输出就好了。
实现过程:
- 开启文件IO流将保存的文件读入程序。
- 从HTTP Response里面获得输出流,往里面写就好了。
@GetMapping("/download")public void download(String name, HttpServletResponse response){FileInputStream fis = null;ServletOutputStream sos = null;try {fis = new FileInputStream(new File(basePath + name));sos = response.getOutputStream();int len = 0;byte[] bytes = new byte[1024];while ((len = fis.read(bytes) ) != -1){sos.write(bytes);}sos.flush();} catch (Exception e) {// e.printStackTrace();} finally {try {fis.close();sos.close();} catch (Exception e) {// e.printStackTrace();}}}