我们需要通过一个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;
    }

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐