【JAVA获取URL文件并转成文件流下载】

该博客介绍了一种在Java后端通过URL获取远程文件,将其保存为临时文件,然后转换为Blob流供前端下载的方法。主要涉及网络I/O和文件操作,包括使用FileInputStream、FileOutputStream及HttpServletResponse进行文件流转。
摘要由CSDN通过智能技术生成

我们需要通过一个URL地址获取文件并转为blob流传给前端

思路:

因为java中new File("这里面的路径不能是网络路径"),所以不能直接 通过new File构造器拿到File对象,

可以先通过URL 对象来获取到输入流,再在本地创建一个临时路径写入,再将临时 文件转为文件流反给前端

当然,前端也可以直接 通过a 标签下载,这里主要讲的是前端只能是blob流的形式下载

话不多说,直接 上代码!!

  /**
     * 下载文件 控制器
     *
     * @param path     url地址
     * @param response 响应体
     */
    @ApiOperation(value = "下载文件", notes = "下载文件")
    @ApiImplicitParam(name = "path", value = "url地址", required = true)
    @GetMapping(value = "/downloadFile")
    @ResponseBody
    public void downloadFile(@RequestParam String path, HttpServletResponse response) {

        try {
            File tempFile = getFile(path);
            try (FileInputStream fis = new FileInputStream(tempFile)) {
                byte[] buffer = new byte[fis.available()];
                int read = fis.read(buffer);
                // 清空response
                response.reset();
                // 设置response的Header
                response.addHeader("Content-Length", "" + tempFile.length());
                response.addHeader("Content-Disposition", "attachment;filename=" + new String(tempFile.getName().getBytes()));
                OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
                response.setContentType("application/octet-stream");
                toClient.write(buffer);
                toClient.flush();
                toClient.close();
            }
        } catch (Exception e) {
            log.error("下载出错-》:{}",e.getMessage());
        }
    }



    /**
     * 创建一个临时文件
     * @param url 远端文件Url
     * @return File
     */
    private File getFile(String url) {
        //对本地文件命名
        String fileName = url.substring(url.lastIndexOf("."), url.length());
        File file = null;

        URL urlfile;
        try {
            // 创建一个临时路径
            file = File.createTempFile("file", fileName);
            log.info("tempFile:->{}",file.getAbsolutePath());
            //下载
            urlfile = new URL(url);

            try (InputStream inStream = urlfile.openStream();
                 OutputStream os =  new FileOutputStream(file);) {
                int bytesRead = 0;
                byte[] buffer = new byte[8192];
                while ((bytesRead = inStream.read(buffer, 0, 8192)) != -1) {
                    os.write(buffer, 0, bytesRead);
                }
            }
        } catch (Exception e) {
            log.error("创建临时文件出错:-》{}",e.getMessage());
        }
        return file;
    }

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

六月秋峰

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

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

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

打赏作者

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

抵扣说明:

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

余额充值