赞
踩
原理:前端让用户选择一个文件,点击丢给后端上传,后端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输出就好了。
实现过程:
@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(); } } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。