大家好,我是每天都要不断疯狂学习不断 提升自我的 Cx_330
😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘
🍸文件的上传和下载😎
🍡说明😗
本片博文是基于reggie项目, 使用的技术包含SpringBoot MybatisPlus
在前后端进行文件的传输最后实现图片在 前端的展示的效果,学会这个小知识点还 是很必要的!
🍎文件上传需掌握😗
- 在浏览器上要完成文件的上传和下载这个需求,首先我们需要对前端知识有一定的了解
- 🌴图片以表格为框架上传
- 🌴MEthod为Post
- 🌴Input 的Type为 File
🧊前端实战剖析😗
- 例子
- 🌴首先 打开要访问的文件上传页面
- 然后我们点开之后随机选择一张图片
- 🌴我们会发现 当我们点击一张图片的时候,浏览器的控制台出现了两个文件
- 上传文件
- 下载文件
- 🌴这个过程其实是和服务器进行了信息传输
- 打开上传文件
- 🌴可以发现请求方式是Post 然后通过一个请求路径请求我们的服务器,我们的服务器接收之后做进一步的处理
- 🌴可以看到,服务器响应回来的信息就是图片的名称
- 点击文件下载的那个文件
- 🌴可以看出两点重要的信息
- 通过Get方式去请求
- 传递的参数是图片的名称
- 因为服务器端的响应其实就是直接将图片给展示在浏览器上面了,所以没有返回值
☕后端代码实战😗
- 🌴文件的上传与下载
@RestController @Slf4j @RequestMapping("/common") public class CommonConntroller { //通过el表达式 可以使用yml配置文件里面的路径 @Value("${reggie.path}") private String basePath; /** * 文件上传 * @param file * @return */ @PostMapping("/upload") public R<String> upload(MultipartFile file){ //name是一个临时文件 需要转存到指file定位置 否则本次请求完成后临时文件会被删除 log.info(file.toString()); //获取原始文件名 String originalFilename = file.getOriginalFilename(); //不建议用这种方法 因为当文件名一样时 后面图片会覆盖前面图片 String s = originalFilename.substring(originalFilename.lastIndexOf(".")); //可以使用UUID生成随机文件名 String imageName = UUID.randomUUID().toString() + s; //判断basePath目录是否存在 如果不存在先创建目录 File f = new File(basePath); if(!f.exists()){ f.mkdirs(); } try { //降临时文件转换到指定位置 file.transferTo(new File(basePath+imageName)); } catch (IOException e) { e.printStackTrace(); } return R.success(imageName); } /** * 文件下载 * @param name * @param response */ @GetMapping("/download") public void dowmLoad(String name, HttpServletResponse response){ try { //通过输入流 读取文件内容 FileInputStream inputStream = new FileInputStream(new File(basePath+name)); //通过输出流将文件写回浏览器 在浏览器展示图片 response.setContentType("image/jpeg"); ServletOutputStream outputStream = response.getOutputStream(); int length=0; byte[] bytes = new byte[1024]; while ((length=inputStream.read(bytes))!=-1){ outputStream.write(bytes,0,length); outputStream.flush(); } //关闭io资源 outputStream.close(); inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } }
- 🌴注意我那个BasPath是已经在配置文件里面定义好了,所以可以直接通过el表达式的形式进行使用
- 🌴这样做的好处就是可以动态指定下载文件的地址,便于后期的维护
🌴在文件下载的时候还用到了UUID这个方法
UUID.randomUUID().toString()
好处就是防止文件名重复。
🌴有个小知识点可能大家平时会忽略
String s = originalFilename.substring(originalFilename.lastIndexOf("."));
🌴先通过lastIndexOf方法找到.的下标索引,然后在通过substring分割 注意这个分割之后的字符串包含 .
🌴然后文件下载的话
FileInputStream inputStream = new FileInputStream(new File(basePath+name));
🌴这行代码可能要多注意一下,可能会不小心犯错,构建一个字节输入流,在new file的时候一定要是这个图片的具体路径全名
- 🌴其余的都是一些IO一些基本的操作,只要基础牢固,剩下的都不是问题