浏览器文件下载

发布于:2022-12-25 ⋅ 阅读:(525) ⋅ 点赞:(0)
文件下载:
1. 将文件以流的形式一次性读取到内存,通过响应输出流输出到前端
@RequestMapping("/testdownload")
public void download(HttpServletResponse response) {
    log.info("【tblThirdVisitinfoCon】查询一条信息 [tblThirdVisitinfoCon/download] 接口");
    try {
        String path = "E:\\flow\\第三方体检接口对接\\公卫移动端\\查询机构内个人信息档案列表.docx";
        // path是指想要下载的文件的路径
        File file = new File(path);
        log.info(file.getPath());
        // 获取文件名
        String filename = file.getName();
        // 获取文件后缀名
        String ext = filename.substring(filename.lastIndexOf(".") + 1).toLowerCase();
        log.info("文件后缀名:" + ext);

        // 将文件写入输入流
        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");
        //Content-Disposition的作用:告知浏览器以何种方式显示响应返回的文件,用浏览器打开还是以附件的形式下载到本地保存
        //attachment表示以附件方式下载 inline表示在线打开 "Content-Disposition: inline; filename=文件名.mp3"
        // filename表示文件的默认名称,因为网络传输只支持URL编码的相关支付,因此需要将文件名URL编码后进行传输,前端收到后需要反编码才能获取到真正的名称
        response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
        // 告知浏览器文件的大小
        response.addHeader("Content-Length", "" + file.length());
        OutputStream outputStream = new         BufferedOutputStream(response.getOutputStream());
        response.setContentType("application/octet-stream");
        outputStream.write(buffer);
        outputStream.flush();
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}
2. 将输入流中的数据循环写入到响应输出流中,而不是一次性读取到内存,通过响应输出流输出到前端
/**
 * @param response
 * @功能描述 下载文件:将输入流中的数据循环写入到响应输出流中,而不是一次性读取到内存
 */
@RequestMapping("/download")
public void downloadLocal(HttpServletResponse response) throws IOException {
    String path = "E:\\flow\\第三方体检接口对接\\third_orgunit_user.sql";
    // 读到流中
    InputStream inputStream = new FileInputStream(path);// 文件的存放路径
    response.reset();
    response.setContentType("application/octet-stream");
    String filename = new File(path).getName();
    response.addHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(filename, "UTF-8"));
    ServletOutputStream outputStream = response.getOutputStream();
    byte[] b = new byte[1024];
    int len;
    //从输入流中读取一定数量的字节,并将其存储在缓冲区字节数组中,读到末尾返回-1
    while ((len = inputStream.read(b)) > 0) {
        outputStream.write(b, 0, len);
    }
    inputStream.close();
}

网站公告

今日签到

点亮在社区的每一天
去签到