当前位置:   article > 正文

uniapp在线预览pdf_uniapp点击查看pdf文件

uniapp点击查看pdf文件

准备

先下载pdf.js然后和node_modules同级新建一个hybrid文件目录,把下载好的pdf.js解压进去,(微信收藏里有)

 开始

然后在pages下新建一个FilePreview页面,用来呈现预览的pdf

在FilePreview.vue页面中:

  1. <template>
  2. <view>
  3. <web-view :src="allUrl"></web-view>
  4. </view>
  5. </template>
  6. <script>
  7. export default {
  8. data() {
  9. return {
  10. viewerUrl: '/hybrid/html/readPdf/index/index.html',
  11. allUrl: ''
  12. };
  13. },
  14. // 加载页面时接收的参数
  15. onLoad(options) {
  16. this.allUrl = this.viewerUrl + '?url=' + options.url
  17. console.log(options, '00000');
  18. }
  19. }
  20. </script>
  21. <style lang="scss">
  22. </style>

在请求后端文件流的组件,或者页面中,得转成Blob文件类型,我这里的查看文件,是在UpLoader组件里面写的

 

  1. <!-- 上传 -->
  2. <template>
  3. <view class="up-loader">
  4. <van-uploader v-model="fileList" :preview-full-image="false" @click-preview="clickItem" :before-delete="deletFile"
  5. :after-read="upFile" accept="file">
  6. <van-button icon="plus"></van-button>
  7. </van-uploader>
  8. </view>
  9. </template>
  10. <script>
  11. import storage from '@/common/storage.js'
  12. export default {
  13. name: "up-loader",
  14. data() {
  15. return {
  16. fileList: [],
  17. idsArr: [] // 点击预览需要传给后端id的数组
  18. }
  19. },
  20. methods: {
  21. afterRead(file) {
  22. console.log(file, 999);
  23. },
  24. // 删除事件
  25. deletFile(val, index) {
  26. this.fileList.splice(index.index, 1)
  27. },
  28. // 文件上传
  29. upFile(val) {
  30. val.status = 'uploading'
  31. val.message = '上传中...'
  32. uni.uploadFile({
  33. url: 'http://xxx.xxx.xx:9000/portal/system/file/v1/upload?tenantId=-1',
  34. name: 'file',
  35. header: {
  36. Authorization: storage.getItemSync('token') ? storage.getItemSync('token') : ''
  37. },
  38. formData: {
  39. file: val.file
  40. },
  41. success: (res) => {
  42. if (res.statusCode === 200) {
  43. val.status = 'success'
  44. val.message = '上传成功'
  45. this.idsArr.push(res.data)
  46. this.$emit('change', res.data)
  47. }
  48. }
  49. })
  50. },
  51. // 点击预览
  52. clickItem(val, index) {
  53. let params = JSON.parse(this.idsArr[index.index]).fileId;
  54. this.$api.preview(params).then(res => {
  55. let pdfData = res
  56. let blob = new Blob([pdfData], {
  57. type: 'application/pdf;charset=UTF-8'
  58. })
  59. // 得转成blob文件
  60. pdfData = window.URL.createObjectURL(blob)
  61. let url = encodeURIComponent(pdfData)
  62. // 最后已encodeURIComponent的格式输出
  63. uni.navigateTo({
  64. url: '/pages/FilePreview/FilePreview?url=' + url
  65. })
  66. })
  67. }
  68. }
  69. }
  70. </script>
  71. <style lang="scss" scoped>
  72. .van-button {
  73. padding: 79rpx 54rpx;
  74. border: 2rpx solid #ddd;
  75. font-size: 38rpx;
  76. }
  77. </style>

注意:

在接口请求的时候在请求前加{responseType: arraybuffer}要不然请求出来会看不到东西

request.js封装:

  1. import storage from './storage'
  2. import config from '@/common/config.js'
  3. import {
  4. Notify
  5. } from 'vant'
  6. const BASE_URL = config.api()
  7. export const request = (url, method, params, responseType) => {
  8. return new Promise((resolve, reject) => {
  9. uni.request({
  10. url: BASE_URL + url, // 地址
  11. method: method || 'post', // 请求方式
  12. responseType: responseType ? responseType : '',
  13. header: {
  14. Authorization: storage.getItemSync('token') ? storage.getItemSync('token') : ''
  15. }, // token
  16. data: params || {}, // 参数
  17. success: (res) => {
  18. if (res.statusCode === 401) {
  19. uni.navigateTo({
  20. url: '/pages/login/login'
  21. })
  22. return
  23. } else if (res.statusCode === 500) {
  24. Notify('操作错误', '1500', 'error')
  25. return
  26. }
  27. // 成功将data抛出
  28. resolve(res.data)
  29. },
  30. // ... 这里还可以做一些请求完成之后的提示
  31. fail: (err) => {
  32. Notify('系统错误', '1500', 'error')
  33. return reject(err)
  34. }
  35. })
  36. })
  37. }

在定义接口的时候

  1. import {
  2. request
  3. } from '@/common/request.js'
  4. export default {
  5. // 预览
  6. preview: (id) => request(`/portal/system/file/v1/preview?fileId=${id}`, 'get', '', 'arraybuffer')
  7. }

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/1001445
推荐阅读
相关标签
  

闽ICP备14008679号