前端在线预览pdf、png、jpg文件流

前端通过 arraybuffer 向后端请求文件内容,文件名信息会放在 res.headers["content-disposition"]

  • 如果浏览器支持 window.navigator 则通过以下方式在线预览:
const data = res.data;
const tempName = decodeURI(res.headers["content-disposition"].split("fileName=")[1]);
if (window.navigator && window.navigator.msSaveOrOpenBlob) {
    const blob = new Blob([data], { type: file_type,});
    window.navigator.msSaveOrOpenBlob(blob, tempName);
}
  • 如果浏览器不支持 window.navigator 则通过以下方式在线预览:
const data = res.data;
let blob = new Blob([data], {type: file_type,});
let href = window.URL.createObjectURL(blob);
window.open(href);

这种方式会调用当前浏览器自带的pdf查看器、图片查看器来查看pdf、png、jpg文件流

下面附上我封装好的功能函数:

// 预览文件
// url为请求后端文件流接口的url
let previewFile = function (url) {
    request(url, {}, "GET", {}, "arraybuffer")
        .then((res) => {
            console.log(res);
            if (res.headers["content-disposition"] == undefined) {
            	alert("文件可能丢失了!");
            } else {
                let file_type = "";
                let finalindex = res.headers["content-disposition"].split("fileName=")[1].split(".").length;
                let filetype = res.headers["content-disposition"].split("fileName=")[1].split(".")[finalindex - 1]
                if (["pdf", "png", "jpg", "jpeg"].includes(filetype)) {
                    switch (filetype) {
                        case "pdf":
                            file_type = "application/pdf";
                            break;
                        case "png":
                            file_type = "image/png";
                            break;
                        case "jpg":
                            file_type = "image/jpeg";
                            break;
                        case "jpeg":
                            file_type = "image/jpeg";
                            break;
                    }
                    const data = res.data;
                    const tempName = decodeURI(
                        res.headers["content-disposition"].split("fileName=")[1]
                    );
                    if (window.navigator && window.navigator.msSaveOrOpenBlob) {
                        const blob = new Blob([data], {
                            type: file_type,
                        });
                        console.log(tempName);
                        window.navigator.msSaveOrOpenBlob(blob, tempName);
                    } else {
                        let blob = new Blob([data], {
                            type: file_type,
                        });
                        let href = window.URL.createObjectURL(blob);
                        console.log(href);
                        window.open(href);
                    }
                } else {
                	alert("该文件类型暂不支持在线预览,请下载后查看!");
                }
            }
        })
        .catch((err) => {
            console.log(err);
            alert("出错了!");
        });
}

export default {
    previewFile
}
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

NJR10byh

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

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

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

打赏作者

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

抵扣说明:

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

余额充值