栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

文章目录
  • 文件的上传和下载
    • 说明
    • 文件上传需掌握
    • 流前端实战剖析
    • ☕后端代码实战

大家好,我是每天都要不断疯狂学习不断
提升自我的    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;

    
    @PostMapping("/upload")
    public R 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);
    }

    
    @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一些基本的操作,只要基础牢固,剩下的都不是问题
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/953311.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号