开发中必备的文件的上传与下载

大家好,我是每天都要不断疯狂学习不断
提升自我的    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一些基本的操作,只要基础牢固,剩下的都不是问题
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C_x_330

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值