我的vue2项目安装了vue-pdf要报错,感觉是node版本的问题,我就找了其他的办法,使用iframe也可以简单时间pdf文件的预览,其中预览自带分页、下载、旋转、比例等功能,能够满足基本需求。
实现过程为,首先通过id从后端获取文件流,把它转成url,然后赋值到iframe的src上
代码如下:
使用弹框包裹iframe,使其在当前页面直接预览
index.vue文件
<el-dialog :visible.sync="dialogVisible" :fullscreen="true">
<iframe
:src="dialogImageUrl"
style="border: none; width: 100%; min-height: 88vh"
>
<p>您的浏览器不支持 iframe 标签,请从列表中下载预览</p>
</iframe>
</el-dialog>
api/index.js文件配置接口
import axios from "axios";
// 预览文档
export const viewDoc = (params) => {
return axios({
url: "/invertedindexsystem/file-info/viewDoc",
params: params,
responseType: "blob",
});
};
index.vue文件js部分
<script>
import {
viewDoc,
} from "@/api/index";
export default {
name: "IndexView",
data() {
return {
dialogImageUrl: "",
dialogVisible: false,
};
},
methods: {
toDetails(data) {
viewDoc({
id: data.id,
}).then((res) => {
if (!res.data) return;
var binaryData = [];
binaryData.push(res.data);
let url = window.URL.createObjectURL(
new Blob(binaryData, {
type: "application/pdf;charset=utf-8",
})
);
if (url != null && url != undefined && url) {
this.dialogVisible = true;
this.dialogImageUrl = url;
}
});
},
},
};
</script>
重点:接口封装部分响应类型设置为blob,默认为get请求方法,但是写在js文件中axios.get又会报错
如下写都会报错:
export const viewDoc = (params) => {
return axios.get({
url: "/invertedindexsystem/file-info/viewDoc",
params: params,
responseType: "blob",
});
};
export const viewDoc = (params) => {
return axios.get(
url: "/invertedindexsystem/file-info/viewDoc",
params: params,
{responseType: "blob"});
};
报错:如果报错:Uncaught (in promise) TypeError: Failed to execute ‘createObjectURL’ on ‘URL’: Overload resolution failed.
at eval也是上面代码错误的原因,没有识别到响应类型是blob