uni-app在线预览PDF
需求
文件不可以通过文件地址直接访问,要通过文件流的形式在线预览
工具
基于pdfjs封装的组件(别人封装的),用webview访问本地网页
遇到的问题
- 开始的时候以为他可以自己获取文件流并处理,所以直接将请求地址传进去了
- 意识到他不能处理blob,手动处理,将blob转为url
- 正常处理了blob,处理后的url传进去,页数显示正常,但内容为空
踩坑的过程
先看一下文件路径,资源会在文末分享
1 创建webview访问这个viewer.html
<template> <view style="width: 100%;" > <web-view :src="allUrl"></web-view> </view> </template> <script> export default { data() { return { allUrl:'', viewerUrl: '/hybrid/html/web/viewer.html', // 格式化文件流的一个js 文件 文末会分享出来 } }, onLoad(options) { let {url, title} = options uni.setNavigationBarTitle({ title: title }) this.allUrl = this.viewerUrl + url } </script>
传进来的url是/read/tryread?bookId=${this.bookId}
,但是pdfjs默认是不能处理这种形式的url的
2 先获取二进制流,转url
在这个页面请求数据,然后转url传到pdfjs中,然后改进代码
<template> <view style="width: 100%;" > <web-view :src="allUrl"></web-view> </view> </template> <script> export default { data() { return { allUrl:'', viewerUrl: '/hybrid/html/web/viewer.html', // 格式化文件流的一个js 文件 文末会分享出来 } }, methods: { getFile(url) { uni.request({ url: this.$photoHeader + 'api' + url, header: { 'Content-Type': 'application/pdf', 'authorization': this.$store.getters.getToken }, success: (res) => { // ↓↓↓↓注意下面这里 const fileUrl = this.transBlobToUrl(res.data) this.allUrl = this.viewerUrl + '?file=' + fileUrl console.log(this.allUrl); }, }); }, transBlobToUrl(file) { // 将获取的blob转化为url // console.log(file); let url = null; if (window.createObjectURL != undefined) { // basic url = window.createObjectURL(file); } else if (window.webkitURL != undefined) { // webkit or chrome try { url = window.webkitURL.createObjectURL(file); } catch (error) { console.log(error) } } else if (window.URL != undefined) { // mozilla(firefox) try { url = window.URL.createObjectURL(file); } catch (error) { console.log(1); console.log(error) } } return url; }, }, onLoad(options) { let {url, title} = options uni.setNavigationBarTitle({ title: title }) this.getFile(decodeURIComponent(url)) } } </script>
这应该可以获取到url了,但是还是不行,看到getFile
中标记的地方了吗,问题就在这,他这里拿到的数据成了string,需要将string转为blob格式
将获取url的语句改为 const fileUrl = this.transBlobToUrl(new Blob([res.data]))
最后一步,临门一脚
这时候数据拿到了,也转成url了,再回到页面中,!!!白屏,但是页数正常
查了好久之后发现,需要将响应格式声明为arraybuffer,也就是这样
然后再看页面,完美!
插件地址:
链接: https://pan.baidu.com/s/1xTTQPVWfJEVnY0hWlj7gdg 提取码: t8mn