您现在的位置是:首页 > 技术教程 正文

Vant Uploader 文件上传并预览(pdf文件)

admin 阅读: 2024-03-30
后台-插件-广告管理-内容页头部广告(手机)

利用vant的组件Uploader实现文件上传,并且实现上传的文件在前端进行预览,不涉及服务端。实现的效果:pdf文档如果多页,可进行上下滑动。在移动端正常使用,pc端暂无验证。

参考了这个https://github.com/Hanpeng-Chen/hampton-demo-repo,里面有好几种方法,我使用的只是其中一种。

目录

1、安装插件

2、引入插件

3、html部分

4、js部分

5、style部分


1、安装插件

npm install pdfjs-dist@^2.0.943

2、引入插件

注:第二行很重要,不用会报错

  1. import pdfJS from 'pdfjs-dist';
  2. pdfJS.GlobalWorkerOptions.workerSrc = require('pdfjs-dist/build/pdf.worker.entry');

3、html部分

  1. <template>
  2. <div class="hp-container">
  3. <div class="scroll-pdf-contanier" id="scrollPdfBox">
  4. <div v-for="index in pdfTotalPages" :key="index">
  5. <canvas :ref="`scrollPdfCanvas${index}`" class="content">canvas>
  6. div>
  7. div>
  8. <van-uploader accept="file" result-type="text" v-model="fileList" multiple :max-count="1" class="uploader" ref="file" :after-read="afterRead" :before-read="beforeRead">van-uploader>
  9. <van-row type="flex" justify="space-between" align="center">
  10. <van-col>
  11. <van-button @click="back">返回van-button>
  12. van-col>
  13. <van-col>
  14. <van-button type="info" @click="upload">上传文件van-button>
  15. van-col>
  16. van-row>
  17. div>
  18. template>

4、js部分

  1. import pdfJS from 'pdfjs-dist';
  2. pdfJS.GlobalWorkerOptions.workerSrc = require('pdfjs-dist/build/pdf.worker.entry');
  3. export default {
  4. name: 'uploadFile',
  5. components: {
  6. },
  7. data () {
  8. return {
  9. fileList: [],
  10. pdfTotalPages: 1,
  11. pdfData: null, // PDF的base64
  12. scale: 1 // 缩放值
  13. };
  14. },
  15. methods: {
  16. back () {
  17. this.$router.go(-1);
  18. },
  19. upload () {
  20. this.$refs.file.chooseFile();
  21. },
  22. // 文件读取前的回调函数,返回 false 可终止文件读取,支持返回 Promise
  23. beforeRead (file) {
  24. if (Array.isArray(file) && file.length > 1) {
  25. this.$toast('只能上传一份文件');
  26. return false;
  27. }
  28. if (file.type !== 'application/pdf') {
  29. this.$toast('请上传 pdf 格式的文件');
  30. return false;
  31. }
  32. return true;
  33. },
  34. // 文件读取完成后的回调函数
  35. afterRead (file) {
  36. const _this = this;
  37. var reader = new FileReader();
  38. reader.readAsDataURL(file.file); // 读取文件
  39. reader.onload = function (e) {
  40. const data = atob(reader.result.substring(reader.result.indexOf(',') + 1));
  41. _this.loadPdfData(data);
  42. }
  43. reader.onerror = () => {
  44. _this.$toast('文件解析失败,请重新上传');
  45. _this.fileList = [];
  46. _this.$refs.file.deleteFile();
  47. };
  48. },
  49. loadPdfData (data) {
  50. // 读取base64的pdf流文件
  51. this.pdfData = pdfJS.getDocument({
  52. data: data, // PDF base64编码
  53. cMapUrl: '',
  54. cMapPacked: true
  55. });
  56. this.renderScrollPdf();
  57. },
  58. renderScrollPdf () {
  59. this.pdfData.promise.then(pdf => {
  60. this.pdfTotalPages = pdf.numPages;
  61. this.renderScrollPdfPage(1);
  62. });
  63. },
  64. // 渲染连续滚动PDF
  65. renderScrollPdfPage (num) {
  66. this.pdfData.promise.then(pdf => {
  67. const numPages = pdf.numPages;
  68. pdf.getPage(num).then(page => {
  69. const canvas = this.$refs[`scrollPdfCanvas${num}`][0];
  70. // 为了预览的文件内容比较清晰,所以缩放值使用了3
  71. const viewport = page.getViewport(3);
  72. console.log('viewport :>> ', viewport);
  73. canvas.height = viewport.height * this.scale;
  74. canvas.width = viewport.width * this.scale;
  75. const ctx = canvas.getContext('2d');
  76. const renderContext = {
  77. canvasContext: ctx,
  78. viewport: viewport
  79. };
  80. page.render(renderContext).then(() => {
  81. if (num < numPages) {
  82. this.renderScrollPdfPage(num + 1);
  83. }
  84. });
  85. });
  86. });
  87. }
  88. }
  89. };

5、style部分

  1. // 隐藏文件上传样式
  2. ::v-deep .van-uploader {
  3. display: none;
  4. }
  5. // 防止预览文件超过一屏
  6. .content{
  7. width: 750px;
  8. }

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索