java 获取 项目resource下文件以流的形式传给前端

本文介绍了一个用于单机版应用的文件下载接口的具体实现方法。该接口通过解析请求参数,从本地文件系统中读取指定文件,并将其作为HTTP响应返回给客户端,支持文件名的URL编码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    /**
     * @param
     * @param response
     * @功能描述 为了单机版本服务的 下载文件:
     * 单机版本获取文件地址 返回的http地址 会直接调用这个接口
     */
    @PostMapping("/load")
    public void load(@RequestBody LoadRequest request, HttpServletResponse response) throws Exception {
        try {
            String path = this.getClass().getClassLoader().getResource("").getPath();//注意getResource("")里面是空字符串
            String filePath = path+"/revivefile/"+request.getFilename();
//            String decodePath = Base64Util.decode(filePath);
            File file = new File(filePath);
            log.info("===file.download======filePath" + filePath + "=======decodePath" );

            // 将文件写入输入流
            FileInputStream fileInputStream = new FileInputStream(file);
            InputStream fis = new BufferedInputStream(fileInputStream);
            byte[] buffer = new byte[fis.available()];
            fis.read(buffer);
            fis.close();

            // 清空response
            response.reset();
            // 设置response的Header
            response.setCharacterEncoding("UTF-8");
            response.setContentType("multipart/form-data");
            //Content-Disposition的作用:告知浏览器以何种方式显示响应返回的文件,用浏览器打开还是以附件的形式下载到本地保存
            //attachment表示以附件方式下载   inline表示在线打开   "Content-Disposition: inline; filename=文件名.mp3"
            // filename表示文件的默认名称,因为网络传输只支持URL编码的相关支付,因此需要将文件名URL编码后进行传输,前端收到后需要反编码才能获取到真正的名称
            response.setHeader("Access-Control-Allow-Origin", "*");
            response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(request.getFilename(), "UTF-8"));
            response.setHeader("Content-type", "application-download");
            // 告知浏览器文件的大小
            response.addHeader("Content-Length", "" + file.length());
            OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
            outputStream.write(buffer);
            outputStream.flush();

            DownloadRecords records = new DownloadRecords();
            records.setCreateUserId(request.getUserId());
            records.setCreateTime(new Date());
            records.setDownloadType(request.getFileType());
            records.setId(System.currentTimeMillis());
            recordsMapper.insertSelective(records);


        } catch (IOException ex) {
            ex.printStackTrace();
            throw new Exception("download error");
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值