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

这篇具有很好参考价值的文章主要介绍了Vant Uploader 文件上传并预览(pdf文件)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

利用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、引入插件

注:第二行很重要,不用会报错文章来源地址https://www.toymoban.com/news/detail-510023.html

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

3、html部分

<template>
    <div class="hp-container">
        <div class="scroll-pdf-contanier" id="scrollPdfBox">
            <div v-for="index in pdfTotalPages" :key="index">
                <canvas :ref="`scrollPdfCanvas${index}`" class="content"></canvas>
            </div>
        </div>

        <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>

       
        <van-row type="flex" justify="space-between" align="center">
            <van-col>
                <van-button @click="back">返回</van-button>
            </van-col>
            <van-col>
                <van-button type="info" @click="upload">上传文件</van-button>
            </van-col>
        </van-row>
    </div>
</template>

4、js部分

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

export default {
  name: 'uploadFile',
  components: {
  },
  data () {
    return {
      fileList: [],
      pdfTotalPages: 1,
      pdfData: null, // PDF的base64
      scale: 1 // 缩放值
    };
  },
  methods: {
    back () {
      this.$router.go(-1);
    },
    upload () {
      this.$refs.file.chooseFile();
    },
    // 文件读取前的回调函数,返回 false 可终止文件读取,支持返回 Promise
    beforeRead (file) {
      if (Array.isArray(file) && file.length > 1) {
        this.$toast('只能上传一份文件');
        return false;
      }

      if (file.type !== 'application/pdf') {
        this.$toast('请上传 pdf 格式的文件');
        return false;
      }
      return true;
    },
    // 文件读取完成后的回调函数
    afterRead (file) {
      const _this = this;
      var reader = new FileReader();
      reader.readAsDataURL(file.file); // 读取文件
      reader.onload = function (e) {
        const data = atob(reader.result.substring(reader.result.indexOf(',') + 1));
        _this.loadPdfData(data);
      }

      reader.onerror = () => {
        _this.$toast('文件解析失败,请重新上传');
        _this.fileList = [];
        _this.$refs.file.deleteFile();
      };
    },
    loadPdfData (data) {
      // 读取base64的pdf流文件
      this.pdfData = pdfJS.getDocument({
        data: data, // PDF base64编码
        cMapUrl: '',
        cMapPacked: true
      });

      this.renderScrollPdf();
    },
    renderScrollPdf () {
      this.pdfData.promise.then(pdf => {
        this.pdfTotalPages = pdf.numPages;
        this.renderScrollPdfPage(1);
      });
    },
    // 渲染连续滚动PDF
    renderScrollPdfPage (num) {
      this.pdfData.promise.then(pdf => {
        const numPages = pdf.numPages;
        pdf.getPage(num).then(page => {
          const canvas = this.$refs[`scrollPdfCanvas${num}`][0];

          // 为了预览的文件内容比较清晰,所以缩放值使用了3 
          const viewport = page.getViewport(3);

          console.log('viewport :>> ', viewport);
          canvas.height = viewport.height * this.scale;
          canvas.width = viewport.width * this.scale;
          const ctx = canvas.getContext('2d');
          const renderContext = {
            canvasContext: ctx,
            viewport: viewport
          };
          page.render(renderContext).then(() => {
            if (num < numPages) {
              this.renderScrollPdfPage(num + 1);
            }
          });
        });
      });
    }
  }
};

5、style部分

// 隐藏文件上传样式
::v-deep .van-uploader {
    display: none;
}


// 防止预览文件超过一屏
.content{
  width: 750px;
}

到了这里,关于Vant Uploader 文件上传并预览(pdf文件)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vant Uploader 上传图片功能

    限制上传数量 通过 max-count 属性可以限制上传文件的数量,上传数量达到限制后,会自动隐藏上传区域。 限制上传大小 通过 max-size 属性可以限制上传文件的大小,超过大小的文件会被自动过滤,文件信息通过 oversize 事件获取。 文件上传前进行校验和处理 通过before-read 传入

    2024年02月16日
    浏览(44)
  • vant-uploader多附件上传

    问题一:部分安卓机只有相机和录音选项,没有相册选项。 解决:accept=“image/*” 问题二:移动端上组件只能上传图片,没有文件管理选项,不能上传其他文件类型(pdf, docx等) 解决:accept=“” // 不限制上传的文件类型

    2024年02月11日
    浏览(32)
  • vue+vant+pdfh5:实现点击 pdf 预览所有图片

    1、pdfh5 gitee 2、安装 3、使用及实现

    2024年02月11日
    浏览(41)
  • vue实战--vue+elementUI实现多文件上传+预览(word/PDF/图片/docx/doc/xlxs/txt)

        最近在做vue2.0+element UI的项目中遇到了一个需求:需求是多个文件上传的同时实现文件的在线预览功能。需求图如下:     看到这个需求的时候,小栗脑袋一炸。并不知道该如何下手,之前的实践项目中也并没有遇到相似的功能。因此也废了一番功夫想要实现这样一个

    2024年01月23日
    浏览(82)
  • 微信小程序基于vant和springboot实现附件上传和预览

    图片上传和预览在移动端应用非常广泛和频繁,vant组件库van-uploader组件已经帮我们实现了大部分功能,但是在系统中频繁使用还是有点麻烦,我们根据自身的业务系统重新封装了一下简化我们的开发。后端使用springboot集成jcifs实现文件管理微服务。 附件上传 附件预览 组件介

    2024年02月09日
    浏览(58)
  • 利用webview 内嵌实现小程序,h5 ,app 页面跳转和数据通讯,附带实现pdf文件的预览(兼容ios和安卓)

    承载网页的容器。会自动铺满整个小程序页面, 个人类型的小程序暂不支持使用。 客户端 6.7.2 版本开始,navigationStyle: custom 对 web-view 组件无效 相关的属性说明:开放能力 / web-view (qq.com) 2.bindmessage 可以实现网页端和小程序之间通讯, 但只在特定时机触发 网页端向小程序

    2024年02月02日
    浏览(73)
  • 利用PDF.js在微信小程序里预览PDF文件

    在微信小程序可以通过wx.downloadFile 和 wx.openDocument 两个api下载并打开pdf文件。这种方式主要有不少的缺点: 1、需要下载才可以查看,且每次打开都需要下载生成一个临时文件,如果PDF文件比较多的话,临时文件会越来越多,且如果PDF文件比较大的话,打开会比较慢。 2、在导

    2024年02月03日
    浏览(75)
  • 【微信小程序】van-uploader实现文件上传

    使用van-uploader和wx.uploadFile实现文件上传,后端使用ThinkPHP。 1、前端代码 json:引入van-uploader wxml:deletedFile是删除文件函数,设置deletable=“{{ true }}” 和在数据中 deletable: true图片右上角会显示删除按钮,在点击删除图标时调用deletedFile函数去处理删除逻辑。beforeRead:是读之前

    2024年02月14日
    浏览(52)
  • uniapp微信小程序 图片&文件上传并且支持图片和文件预览(pdf等文件预览)巨细教学!

    首先呢,小程序打开pdf等文件有下面几种办法: 用微信自带的wx.downloadFile() + wx.openDocument() 使用web-view,uni-app中webview可以直接加载pdf文件 可以使用网上说的pdf.js去实现(我没有用到这个,就不介绍了) 网上查到很多资料显示安卓是可以通过上面第一种办法,但是ios用第一个

    2024年02月04日
    浏览(71)
  • 扩展element-ui el-upload组件,实现复制粘贴上传图片文件,带图片预览功能

    控件改造 在窗口的 el-form 控件参数中添加 @paste.native 事件,事件绑定方法名 handlePaste 也可以在其他控件中添加事件监听,看个人需求。 注意: 监听粘贴事件时,需要当前页面先获取焦点,否则无法正常监听, 可以在页面加载后调用 focus() 获取焦点 粘贴功能Js部分参考资料

    2023年04月08日
    浏览(100)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包