文件流

如何将各种文件的文件流(blob)转化为线上可以直接预览的数据,这里简单介绍四种不同类型的文件预览。分别是pdf,docx,xlsx,jpg/png/jpeg等。有一个事情是需要重点注意的,文件流必须保证能够被正常下载解析后才可以支持预览,否则以下使用的各种插件都可能会产生报错。(需着重关注文件加解密后文件是否会出现损坏的问题)

以下是从后端获取到的文件流形式:

docx的预览

通过借助插件docx-preview实现。

① 首先安装该插件

npm install docx-preview

② 引入对应包

import { renderAsync } from 'docx-preview';

③调用函数,解析docx文件

renderAsync(res.data, document.getElementById("preload_box"), null, {className: "docx", // 默认和文档样式类的类名/前缀inWrapper: true, // 启用围绕文档内容渲染包装器ignoreWidth: false, // 禁止页面渲染宽度ignoreHeight: false, // 禁止页面渲染高度ignoreFonts: false, // 禁止字体渲染breakPages: true, // 在分页符上启用分页ignoreLastRenderedPageBreak: true, //禁用lastRenderedPageBreak元素的分页experimental: false, //启用实验性功能(制表符停止计算)trimXmlDeclaration: true, //如果为真,xml声明将在解析之前从xml文档中删除debug: false, // 启用额外的日志记录
})

pdf的预览

① 首先安装该插件

npm install pdfjs-dist

② 引入对应包

import * as PDFJS from "pdfjs-dist/legacy/build/pdf";  // 引入PDFJS
import pdfjsWorker from "pdfjs-dist/legacy/build/pdf.worker.entry.js"; // 引入workerSrc的地址

③调用函数,解析pdf文件

const blobPdf = new window.Blob([res.data], { type: 'application/pdf;chaset-UTF-8' })
const pdfhref = URL.createObjectURL(blobPdf);
PDFJS.getDocument(pdfhref).promise.then(pdfDoc=>{const numPages = pdfDoc.numPages; // pdf的总页数// 获取第1页的数据pdfDoc.getPage(1).then(page =>{// 设置canvas相关的属性const canvas = document.getElementById("pdf_canvas");const ctx = canvas.getContext("2d");const dpr = window.devicePixelRatio || 1;const bsr =ctx.webkitBackingStorePixelRatio ||ctx.mozBackingStorePixelRatio ||ctx.msBackingStorePixelRatio ||ctx.oBackingStorePixelRatio ||ctx.backingStorePixelRatio ||1;const ratio = dpr / bsr;const viewport = page.getViewport({ scale: 1 });canvas.width = viewport.width * ratio;canvas.height = viewport.height * ratio;canvas.style.width = viewport.width + "px";canvas.style.height = viewport.height + "px";ctx.setTransform(ratio, 0, 0, ratio, 0, 0);const renderContext = {canvasContext: ctx,viewport: viewport,};// 数据渲染到canvas画布上page.render(renderContext);})
})

关于pdf的解析这里有几个问题需要注意:

1.我们为了正确解析pdf,将pdf文件流转化为一个blob的地址去被解析器读取。
2.由于插件每次只能查询pdf文件一页数据,所以我们需要额外添加翻页的逻辑代码。
3.被pdf渲染的元素pdf_canvas必须是canvas标签。

以下为翻页的代码:

      // 切换pdf页数function changePdfPage (type) {if (type == 'pre') {if (pdfPage.value <= 1) {ElMessage.error('没有上一页了');return }pdfPage.value -= 1} else {if (pdfPage.value >= pdfValue.numPages) {ElMessage.error('没有下一页了');return }pdfPage.value += 1}initPdfPage()}// 重新初始化pdf对应页数function initPdfPage () {pdfValue.getPage(pdfPage.value).then(page =>{// 设置canvas相关的属性const canvas = document.getElementById("pdf_canvas");const ctx = canvas.getContext("2d");const dpr = window.devicePixelRatio || 1;const bsr =ctx.webkitBackingStorePixelRatio ||ctx.mozBackingStorePixelRatio ||ctx.msBackingStorePixelRatio ||ctx.oBackingStorePixelRatio ||ctx.backingStorePixelRatio ||1;const ratio = dpr / bsr;const viewport = page.getViewport({ scale: 1 });canvas.width = viewport.width * ratio;canvas.height = viewport.height * ratio;canvas.style.width = viewport.width + "px";canvas.style.height = viewport.height + "px";ctx.setTransform(ratio, 0, 0, ratio, 0, 0);const renderContext = {canvasContext: ctx,viewport: viewport,};// 数据渲染到canvas画布上page.render(renderContext);})}

xlsx预览

① 首先安装该插件

npm install xlsx

② 引入对应包

import * as XLSX from 'xlsx/xlsx.mjs'
<div class="sheet_list"><p class="sheet_item" v-for="(item, index) in workbook.SheetNames" @click="getTable(item)">{{item}}</p>
</div>
<el-table :data="excelData" style="width: 100%"><el-table-columnv-for="(value, key, index) in excelData[0]":key="index":prop="key":label="key"></el-table-column>
</el-table>
 const xlsx_data = await res.data.arrayBuffer()let tem_workbook = XLSX.read(xlsx_data, {type:"array"}); // 解析数据workbook.value = tem_workbookgetTable(tem_workbook.SheetNames[0]); // 读取第一张表数据// 解析xlsx数据为tablefunction getTable(sheetName) {let worksheet = workbook.value.Sheets[sheetName];excelData.value = XLSX.utils.sheet_to_json(worksheet);}

xlsx插件仅仅是帮我们解析excel表的数据,并没有帮我们排版,所以通常我们需要自己写样式重新排列数据,用element的table组件是个不错的选择。
同时为了可以切换多个表,我们还可以将表名数组作一个遍历,提供给用户切换表的功能。

图片的预览

图片的预览相对而言简单了许多,不需要利用任何插件,仅仅只需要将图片文件流转换为一个可以被查阅的blob地址。

const blobImage = new window.Blob([res.data], { type: 'image/' + fileType }) // fileType指图片的类型
const imageHref = URL.createObjectURL(blobImage); // 创造一个地址
preloadImg.value = imageHref // img标签的src属性的值

结语

以上就是相关一些文件的预览方式,所利用到的插件并非是单一的选择,还有其他的解决方案可以达到我们的目的。但是需要切记的事情是大部分插件都需要我们保证文件的完整性,才能够解析成功,在完成该功能的时候我们需要先关注文件上传和下载的时候有没有丢失或者损坏这个前提。

如何在vue中实现文件预览功能相关推荐

  1. Vue中使用pdfJs预览PDF、图片

    Vue中使用pdfJs预览PDF.图片 pdf.js是一个使用HTML5构建的可移植文档格式库.它可以帮助我们在浏览器中构建pdf文档,实现在线查看pdf文件的功能. 实现步骤如下: 1.下载pdfJ ...

  2. vue移动端文件预览

    vue移动端文件预览 前言: 整体思路: 具体实现: 一.外壳(vViews.vue): 二.文件预览: 1.图片预览: 2.pdf文件预览: 3.docx文件预览: 4.excel表格预览(xls. ...

  3. Vue新手:实现文件预览功能的前端

    预览文件的前端 省略点击按钮点击触发showdialogview()方法的代码 第一种方法 先在template中加入一个input框,绑定一个字符串类型的变量 写showdialogview()方法 ...

  4. vue+vant使用图片预览功能ImagePreview的问题

    如果您搜到这篇文章的话,那员外估计您遇到跟我一样的问题了,即在打开图片预览功能后,如果不关闭预览的图片,同时改变路由的话,会发现即使路由改变了,预览的图片还在文档的最顶层显示,如图: 着实让员外百思不 ...

  5. 怎么实现抢票软件_怎么样在windows上实现文件预览功能?一个软件搞定,提高效率...

    相信用过mac系统的朋友应该都知道,在mac系统中文本.图片或者视频等文件后,直接按空格就能进行文件内容的预览.在找文本.图片.视频或者音频的时候,这个功能是非常的方便实用的.不需要打开文件就能看到文 ...

  6. vue中后端返回word文件下载地址,实现文件预览功能

    土豪选择: 如果不缺钱可以直接使用第三方预览收费的: 这里推荐给大家: 网址:https://view.xdocin.com/ 使用起来也非常的简单,只需要做一个地址拼接就可以使用 用法:(这里使用v ...

  7. Vue中实现pdf文件预览功能

    写在前面: 实现的功能就是点击预览按钮,弹出对话框在线预览pdf文件 实现此功能的前提是需要在Vue项目中安装组件vue-pdf, 在终端命令行输入运行如下语句: npm install --save ...

  8. react项目中实现打印预览功能

    最近项目中,前端采用react+antd+dva的组合, 今天有一个新需求, 需要在后台管理系统中实现 点击打印 完成指定页面的打印功能. 我们道浏览器带有打印功能的实现,window.print() ...

  9. python实现文件上传预览_前端实现文件预览功能

    在做项目的时候,突然接收到一个需求,是能够对其他用户上传的文件进行预览,然后再下载,搜索了一些方法,最终选择了下面的实现,因为只是需要看,不进行而外的操作,所以方法都是比较简单的,后续有其他需求在更新 ...

最新文章

  1. POJ 1581 优先队列 priority_queue -- 比赛胜者求解
  2. 在星辰世界的guandan
  3. 静态类 c# 1615139615
  4. 关于.netMVC 出现@ViewBag 出现错误(波浪红线)的解决方法
  5. 倒角距离(Chamfer distance)和earth mover‘s diatance
  6. CMake快速入门01:CMake简介与安装
  7. 前端开发面试题收集 JS
  8. won10qualcomm atheros无线网卡驱动安装不了
  9. Jetson Nano 入坑之路 ----(9)C++调用SYN6288语音播报模块
  10. Python各类常用库整理
  11. python 协程是啥_什么是Python中的协程
  12. keras中的后端backend及其相关函数(K.prod,K.cast)
  13. Helio X30剩魅族一家客户 联发科恢复元气要一年半
  14. 堂堂985毕业就失业,我用3000块买大厂Offer
  15. Docker镜像创建的三种方式详解——dockerfile制作apache镜像
  16. 大家期待已经的相亲交友网站源码来了
  17. Vue2.0 饿了么报错: Unexpected side effect in lis tShow computed property
  18. android pixelflinger 研究,Android Pixelflinger 研究
  19. 【算法】输油管道问题
  20. 英灵神殿服务器修改器,英灵神殿十二项修改器

热门文章

  1. 转贴:iMac上安装雪豹、Win 7双系统
  2. 直接购买手游联运平台源码,能为游戏企业带来哪些好处?
  3. 做外贸用什么服务器比较好
  4. 布道微服务_20微服务、容器、DevOps
  5. indy-sdk tutorials数字身份认证(二)
  6. NIO/ZeroCopy
  7. 【信息安全案例】—知识点复习(期末不挂科版)
  8. CentOS 7安装 TDH 社区版
  9. Spring Boot –如何更改Tomcat端口
  10. 小红书爆品3大公式+12个卖点,让你的产品更有吸引力