首页 > 其他分享 >axios 下载文件流或者预览在线pdf

axios 下载文件流或者预览在线pdf

时间:2022-12-23 11:23:05浏览次数:42  
标签:axios 预览 resp blob file import pdf

问题: 后端返回文件流,前端使用axios下载或者在线预览

下载文件流

import axios from 'axios'

// 设置响应类型为blob
axios.get('/api/app/xxx/downloadExcel', { responseType: 'blob' }).then(resp => {
    let temp = document.createElement('a') // 创建a标签
    temp.download = 'excel.xls'// 设置下载名称

    // 创建blob对象,在javascript中blob代表一个二进制流对象,不可修改
    const blob = new Blob([resp.data], {
        // 类型从响应头中获取
        type: resp.headers["content-type"]
    });
    // 创建对象url,并赋值给a标签
    let URL = window.URL || window.webkitURL;
    temp.href = URL.createObjectURL(blob);

    // 手动触发点击事件
    temp.click()
})

提示:document.createElement()方法创建的标签,不挂载到document树中,会自动销毁。不用担心内存问题。

在线预览pdf

import axios from 'axios'

axios('/api/app/xxx/pdf', { responseType: 'blob' }).then(res => {
    const blob = new Blob([res.data], { type: res.headers["content-type"] });
    var URL = window.URL || window.webkitURL;
    let href = URL.createObjectURL(blob);

    // 方法一:使用浏览器自带
    window.open(href)

    // 方法二:使用pdf.js(将pdf.js下载至项目pdf文件夹)
    this.pdfUrl = `/pdf/web/viewer.html?file=${encodeURIComponent(href)}`

})

后端工具类

package com.tons.utils;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;

public class ResponseFileUtils {
    public static void responseFile(HttpServletResponse resp, File file) throws IOException {
        responseFile(resp, file, false);
    }

    public static void responseFile(HttpServletResponse resp, File file, boolean pdfDownload) throws IOException {
        // 错误处理
        if (!file.exists()) throw new RuntimeException(file.getAbsolutePath() + " 文件不存在");

        // 判断是否pdf
        int a = file.getName().toLowerCase().lastIndexOf('.');
        int b = file.getName().toLowerCase().indexOf("pdf");
        if (a < b && !pdfDownload) {
            // 允许浏览器预览
            resp.setHeader("content-type", "application/pdf;chartset=UTF-8");
            resp.setHeader("Content-Disposition", "fileName=" + URLEncoder.encode(file.getName(), "utf-8"));
        } else {
            resp.setHeader("content-type", "application/octet-stream");
            // attachment 告知浏览器,这个文件流应该是下载的
            resp.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(file.getName(), "utf-8"));
        }

        // 读取文件,响应给浏览器
        ServletOutputStream out = resp.getOutputStream();
        FileInputStream in = new FileInputStream(file);
        int size = 0;
        byte[] data = new byte[1024];
        while (true) {
            int n = in.read(data, 0, data.length);
            if (n <= 0) break;
            size += n;
            out.write(data, 0, n);
        }
        resp.setContentLength(size); // 返回大小
    }
}

标签:axios,预览,resp,blob,file,import,pdf
From: https://www.cnblogs.com/heirem/p/17000285.html

相关文章

  • 如何给 PDF 文件添加批注?
    ToolsMicrosoftWord2016及以上版本一台电脑鼠标Steps1.使用Word打开PDF文件先复制一份将要打开的文件。拖动到Word快捷方式上。在对话框中选择确定,并......
  • Blazor组件自做十四 : Blazor FileViewer 文件预览 组件
    BlazorFileViewer文件预览组件目前支支持Excel(.docx)和Word(.xlsx)格式示例:https://www.blazor.zone/fileViewershttps://blazor.app1.es/fileViewers使用......
  • python mac docx格式转pdf
    1.翻了很多资料发现大多是Windows的库偏多,并且不支持linux,还需要借助word软件,方案是首先docx转html再转pdf代码:frompydocximportPyDocXfromxhtml2pdfimportp......
  • VUE html2canvas+jsPdf 下载PDF文件并且以文件流的形式传给后端 + 分页处理截断文字问
    安装:npminstall html2canvas--savenpminstalljsPDF--save配置:  //转化PDF组件importhtmlToPdffrom'@/utils/contract/htmlToPdf'Vue.use(htmlToPdf)......
  • axios
    一、(1)、Axios是专注于网络数据请求的库;(2)、相比于原生的XMLHttpRequest对象,axios简单易用;(3)、相比于jQuery,axios更加轻量化,只专注于网络数据的请求;二、(1): (2): (3): ......
  • Linux 利用wkhtmltopdf动态生成pdf
    yumlocalinstallwkhtmltox-0.12.6-1.centos8.x86_64.rpmwkhtmltopdf--version;yuminstalllibpng15*yumlistlibpng15*wkhtmltopdf--disable-smart-shrinki......
  • 如何使用报表工具FastReport VCL 设计器中的 PDF/A?
    Fastreport是目前世界上主流的图表控件,具有超高性价比,以更具成本优势的价格,便能提供功能齐全的报表解决方案,连续三年蝉联全球文档创建组件和库的“Top50Publishers”奖......
  • 如何通过Java提取PDF中的图片
    PDF文档格式具有固定的文档布局,可以避免他人对其进行随意更改。但这也在一定程度上影响了我们对PDF的操作,例如,当我们需要将PDF文档中的图片用于其他地方时。​​FreeSpire.......
  • 如何通过Java提取PDF中的图片
    PDF文档格式具有固定的文档布局,可以避免他人对其进行随意更改。但这也在一定程度上影响了我们对PDF的操作,例如,当我们需要将PDF文档中的图片用于其他地方时。FreeSpire.PDF......
  • PDF页面大小不一样,怎样调整一致?
    PDF尺寸如何修改?PDF是Abode公司旗下开发用于跨平台支持多媒体集成信息的出版和发布,尤其是提供对网络信息发布支持的文档格式。使用PDF文档时,可能会遇到文档的纸张大小不一......