当前位置: 首页 > news >正文

纯静态网站制作磁力狗

纯静态网站制作,磁力狗,wordpress左右滑动相册,建设银行官方网网址实际开发中,常见pdf|word|excel等文件的预览和下载 背景相关类型数据之间的转换1、File转Blob2、File转ArrayBuffer3、Blob转ArrayBuffer4、Blob转File5、ArrayBuffer转Blob6、ArrayBuffer转File 根据Blob/File类型生成可预览的Base64地址基于Blob类型的各种文件的下载各种类型…

实际开发中,常见pdf|word|excel等文件的预览和下载

    • 背景
    • 相关类型数据之间的转换
      • 1、File转Blob
      • 2、File转ArrayBuffer
      • 3、Blob转ArrayBuffer
      • 4、Blob转File
      • 5、ArrayBuffer转Blob
      • 6、ArrayBuffer转File
    • 根据Blob/File类型生成可预览的Base64地址
    • 基于Blob类型的各种文件的下载
    • 各种类型文件的预览及其效果
      • 1、当前使用的node版本
      • 2、 业务场景
      • 3、图片类型预览
        • 3.1、安装依赖
        • 3.2、ImagePreview.vue
        • 3.3、效果
      • 4、Excel文件的预览
        • 4.1、依赖安装
        • 4.2、ExcelPreview.vue
        • 4.3、预览效果
      • 5、word文件的预览
        • 5.1、依赖安装
        • 5.2、WordPreview.vue
        • 5.3、预览效果
      • 6、pdf文件的预览
        • 6.1、依赖安装
        • 6.2、PdfPreview.vue
        • 6.3、预览效果
      • 7、json/xml文件的预览
        • 7.1、依赖安装
        • 7.2、全局引入
        • 7.3、JsonViewer组件的使用
        • 7.4、预览效果
      • 8、bim文件的预览
        • 8.1、依赖安装
        • 8.2、GeoBimPreview.vue
        • 8.3、预览效果

背景

实际开发中,大部分文件的预览会以流的方式传输,前端通过Element等UI库提供的上传组件传给后端File类型数据, 后端返回给前端Blob/ArrayBuffer类型数据 , 前端最终借助各种第三方工具或者自定义tool方法, 实现各种类型文件的下载或者预览. 少部分的会以文件地址的方式进行传输, 那么我们直接访问那个文件url即可.

相关类型数据之间的转换

1、File转Blob

export function fileToBlob(file: File) {return new Promise((resolve, reject) => {const reader = new FileReader();reader.onload = () => {const arrayBuffer: any = reader.result;const blob = new Blob([arrayBuffer], { type: file.type });resolve(blob);};reader.onerror = reject;reader.readAsArrayBuffer(file);});
}

在这里插入图片描述

2、File转ArrayBuffer

export function fileToArrayBuffer(file: File) {return new Promise((resolve, reject) => {const reader = new FileReader();reader.onload = () => {const arrayBuffer: any = reader.result;resolve(arrayBuffer);};reader.onerror = reject;reader.readAsArrayBuffer(file);});
}

3、Blob转ArrayBuffer

export function blobToArrayBuffer(blob) {return new Promise((resolve, reject) => {const reader = new FileReader();reader.onload = () => resolve(reader.result);reader.onerror = reject;reader.readAsArrayBuffer(blob);});
}

4、Blob转File

export function blobToFile(blob, fileName, fileType) {return new File([blob], fileName, { type: fileType })
}

5、ArrayBuffer转Blob

export function arrayBufferToBlob(arrayBuffer, blobType = 'application/octet-stream') {const blob = new Blob([arrayBuffer], { type: blobType  });return blob;
}

6、ArrayBuffer转File

export function arrayBufferToFile(arrayBuffer, fileName, fileType = 'text/plain') {const file= new File([arrayBuffer], fileName, { type: fileType  });return file;
}

根据Blob/File类型生成可预览的Base64地址

有些第三方预览工具不识别Blob/File, 如viewerjsv-viewer 预览图片的时候,是需要图片对应的src的,而不是Blob/File

export function createUrlByBlobOrFile(data: any) {return new Promise((resolve, reject) => {const reader = new FileReader();reader.onload = () => {resolve(reader.result);};reader.onerror = reject;reader.readAsDataURL(data);});
}

基于Blob类型的各种文件的下载

下载的文件响应类型可打印FIle/Blob对象查看,可执行:downloadFileUtil(fileBlob, fileBlob.type, fileBlob.fileName)

export function downloadFileUtil(data: Blob, responseType: string, fileName: any = new Date().valueOf()) {const blob = new Blob([data], { type: responseType });// 创建一个<a></a>标签let a: HTMLAnchorElement | null = document.createElement('a');const blobUrl = window.URL.createObjectURL(blob);a.href = blobUrl;a.download = fileName;a.style.display = 'none';document.body.appendChild(a);a.click();a.remove();// 释放createObjectURL创建的资源window.URL.revokeObjectURL(blobUrl);
}

各种类型文件的预览及其效果

个别预览的第三方插件库,需要使用特定的某些版本,当前指定的版本库都是可用的。

1、当前使用的node版本

在这里插入图片描述

2、 业务场景

  • 用户通过上传组件上传附件

用户从本地上传的附件拿到的类型是File, 保存之后, 拿到的就是文件列表项对应的Blob类型。
在这里插入图片描述

3、图片类型预览

图片类型预览使用的是v-viewerviewerjs, 可支持的预览图片类型有:jpg, jpeg, png, gif

3.1、安装依赖
yarn add v-viewer@^3.0.21 viewerjs@^1.11.7
3.2、ImagePreview.vue

v-viewerviewerjs 可以通过指令、组件和api三种方式实现预览。 实际开发中,基本上都是使用的是Blob类型,Blob类型转换为Base64地址后, 是不能通过import { api as viewerApi } from 'v-viewer';的方式预览的,尽管api的方式很简单,但它貌似只是支持本地文件URL/服务器文件URL。

通过使用viewer组件,借助img标签可以识别Base64图片路径,从而通过点击img列表,实现图片预览

<template><div class="image-preview"><viewer :images="props.images" class="v-viewer"><imgv-for="(imgItem, index) in props.images":key="index"class="view-img-item":src="imgItem.url":alt="imgItem.name":title="imgItem.name"/></viewer><div class="auto-close-preview-com"><Close class="close-icon" @click="closeImgPreviewFn" /></div></div>
</template><script lang="ts" setup>
import 'viewerjs/dist/viewer.css';
import { component as Viewer } from 'v-viewer';
import { onMounted } from 'vue';
import { ElMessage } from 'element-plus';const props = defineProps({images: {type: Array as any,  // images存储的是Blob转成Base64的数组,类型转换上文createUrlByBlobOrFile可实现default: () => [],},
});
const emits = defineEmits(['closeImgPreview']);function closeImgPreviewFn() {emits('closeImgPreview');
}
onMounted(() => {ElMessage.info('点击图片列表可预览~');
});
</script><style lang="css" scoped>
.image-preview {position: fixed;left: 0;top: 0;right: 0;bottom: 0;z-index: 9998;background-color: rgb(0 0 0 / 70%);.v-viewer {width: 100%;height: 100%;.view-img-item {width: 250px;height: 250px;margin-right: 20px;}}.auto-close-preview-com {position: absolute;-webkit-app-region: no-drag;background-color: rgb(0 0 0 / 50%);border-radius: 50%;cursor: pointer;height: 80px;overflow: hidden;right: -40px;top: -40px;transition: background-color 0.15s;width: 80px;color: #ffffff;.close-icon {bottom: 15px;left: 15px;position: absolute;background-position: -260px 0;font-size: 0;height: 20px;line-height: 0;width: 20px;}}
}
</style>
3.3、效果

在这里插入图片描述

4、Excel文件的预览

Excel文件预览使用的是xlsx 插件库, 可支持类型有:xls, xlsx

4.1、依赖安装
yarn add xlsx@^0.18.5
4.2、ExcelPreview.vue
<template><div class="xlsx-preview-box"></div>
</template><script lang="ts" setup>
import { onMounted } from 'vue';
// XLSX: 无法预览docx文件, 预览pdf也会乱码  只能预览xlsx文件
import * as XLSX from 'xlsx';const props = defineProps({fileBlob: {type: Blob,default: () => null,},
});onMounted(() => {if (props.fileBlob) {const reader = new FileReader();// 通过readAsArrayBuffer将blob转换为ArrayBufferreader.readAsArrayBuffer(props.fileBlob);reader.onload = (event: any) => {// 读取ArrayBuffer数据变成Uint8Arrayconst data = new Uint8Array(event.target.result);// 这里的data里面的类型和后面的type类型要对应const workbook = XLSX.read(data, { type: 'array' });const sheetNames = workbook.SheetNames; // 工作表名称const worksheet = workbook.Sheets[sheetNames[0]];const html = XLSX.utils.sheet_to_html(worksheet);document.getElementsByClassName('xlsx-preview-box')[0].innerHTML = html;};}
});
</script><style lang="css">
.xlsx-preview-box {width: 100%;height: 100%;overflow: auto;table {width: 100%;border-spacing: 0;tr {height: 40px;font-size: 14px;color: #666666;line-height: 14px;font-weight: 400;}tr:first-child {background-color: #ececec !important;height: 60px;font-size: 16px;color: #666666;font-weight: 700;}td {min-width: 80px;text-align: center;border: 1px solid #cccccc;}tr:nth-child(2n) {background-color: #fafafa;}tr:nth-child(2n + 1) {background-color: #ffffff;}}
}
</style>
4.3、预览效果

在这里插入图片描述

5、word文件的预览

word文件预览使用的是docx-preview 插件库, 可支持类型有:doc, docx

5.1、依赖安装
yarn add docx-preview@0.3.0

docx-preview 需要是0.3.0版本,最新的0.3.3版本会报docx-preview类型错误。且最新的版本解析的blob文件类型和0.3.0版本不一致,最新版本还会预览失败:报(Can’t find end of central directory : is this a zip file ? If it is, see)。

5.2、WordPreview.vue
<template><div ref="wordPreviewRef" class="word-preview"></div>
</template><script lang="ts" setup>
import { ref, nextTick } from 'vue';
// docx-preview 需要是0.3.0版本,最新的0.3.3版本会报docx-preview类型错误
// 且最新的版本解析的blob类型和0.3.0版本不一致
// 最新版本还会预览失败:报(Can't find end of central directory : is this a zip file ? If it is, see)
import { renderAsync } from 'docx-preview';const props = defineProps<{wordBlob: any;
}>();const wordPreviewRef = ref({});nextTick(() => {renderAsync(props.wordBlob, // blob 的type: application/vnd.openxmlformats-officedocument.wordprocessingml.documentwordPreviewRef.value as HTMLElement, // HTMLElement 渲染文档内容的元素,);
});
</script><style lang="scss" scoped>
.word-preview {width: 100%;height: 100%;overflow: auto;
}
</style>
5.3、预览效果

在这里插入图片描述

6、pdf文件的预览

pdf文件预览使用的是pdfjs-dist 插件库, 可支持类型有:pdf

6.1、依赖安装
yarn add pdfjs-dist@2.16.105

pdfjs-dist 底层是pdfjs。不建议使用打包后的mjs类型的版本包。因为不支持线上环境对GlobalWorkerOptions.workerSrc的支持。具体的是:本地可以引入node_module路径,但是正式环境没这个路径;如果把对应的pdf.worker.min.mjs放到assets下,会报错:Failed to resolve module specifier '@/assets/pdfjs/pdf.worker.min.mjs; 如果放到public下,会报错Failed to load module script, public目录文件不会被编译,浏览器无法识别mjs文件

6.2、PdfPreview.vue
<template><div class="pdf-preview"><!-- block: 避免一个视图显示多个canvas页 --><canvasv-for="pageIndex in pdfPages":id="`pdf-canvas-` + pageIndex"ref="pdfPreviewRef":key="pageIndex"style="display: block"></canvas></div>
</template><script lang="ts" setup>
import { ref, onMounted, nextTick, reactive } from 'vue';// import 'pdfjs-dist/web/pdf_viewer.css';
// 4.5.136版本
// import * as pdfjsLib from 'pdfjs-dist'; // /legacy/build/pdf.js
// import * as pdfjsViewer from 'pdfjs-dist/web/pdf_viewer.js';
import 'pdfjs-dist/web/pdf_viewer.css';
import * as pdfjsLib from 'pdfjs-dist';
import { blobToArrayBuffer } from '@/utils/tools';const props = defineProps<{pdfBlob: any;
}>();const pdfPreviewRef = ref({});
// pdf页数
const pdfPages = ref(0);
// pdf缩放比例
const pdfScale = ref(2.5); // 可以控制canvas的宽高
// pdf文档流,
// 这个不能使用ref,使用ref会报错: Cannot read from private field
let pdfDoc = reactive<any>({});const renderPdf = (num) => {pdfDoc.getPage(num).then((page) => {const canvasId = `pdf-canvas-${num}`;const canvas: any = document.getElementById(canvasId);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: pdfScale.value });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,};page.render(renderContext);if (num < pdfPages.value) {renderPdf(num + 1);}});
};// 获取pdf文档流与pdf文件的页数
const loadFile = async () => {//  string | URL | TypedArray | ArrayBuffer | DocumentInitParametersconst pdfArrayBuffer: any = await blobToArrayBuffer(props.pdfBlob);const loadingTask = pdfjsLib.getDocument(pdfArrayBuffer);loadingTask.promise.then((pdf) => {pdfDoc = pdf; // 获取pdf文档流pdfPages.value = pdf.numPages; // 获取pdf文件的页数nextTick(() => {renderPdf(1);});});
};onMounted(async () => {// 正式环境找不到node_modules// pdfjsLib.GlobalWorkerOptions.workerSrc =//   '../../../node_modules/pdfjs-dist/build/pdf.worker.min.mjs';// 放在assets下: Failed to resolve module specifier '@/assets/pdfjs/pdf.worker.min.mjs// pdfjsLib.GlobalWorkerOptions.workerSrc = '@/assets/pdfjs/pdf.worker.min.mjs';// const baseurl = window.location.origin + window.location.pathname; // 本地路径// ${baseurl}pdfjs/pdf.worker.min.mjs 静态服务访问的返回的是流// pdfjsLib.GlobalWorkerOptions.workerSrc = `${baseurl}pdfjs/pdf.worker.min.mjs`; // Failed to load module script// public/pdfjs/pdf.worker.js: 将'../../../node_modules/pdfjs-dist/build/pdf.worker.js';复制到public目录下pdfjsLib.GlobalWorkerOptions.workerSrc = 'pdfjs/pdf.worker.js';  // “pdfjs/”不能写成“/pdfjs/”, 前者是相对路径, 后者是绝对路径(相对线上环境服务器)loadFile();
});
</script>
<style lang="scss" scoped>
.pdf-preview {width: 100%;height: 100%;overflow: auto;
}
</style>
6.3、预览效果

在这里插入图片描述

7、json/xml文件的预览

vue-json-viewer支持jsonxml文件的预览

7.1、依赖安装
yarn add vue-json-viewer@^3.0.4
7.2、全局引入

在这里插入图片描述

7.3、JsonViewer组件的使用

fileData存储的是后端接口返回的json字符串

<json-viewer v-else-if="preState.fileType === 'Json'" :value="preState.fileData" />
7.4、预览效果

在这里插入图片描述
在这里插入图片描述

8、bim文件的预览

geobim文件的预览使用的是@xbim/viewer插件库,当前使用的方式支持BlobUrl两种方式

8.1、依赖安装
yarn add @xbim/viewer@^2.1.0-pre202305041434
8.2、GeoBimPreview.vue

该组件接收的是url, 但是loadGeoBim处理兼容了Blob

<template><canvas id="bim-canvas" style="width: 100%; height: 100%"></canvas>
</template><script lang="ts" setup>
import { watch, nextTick } from 'vue';
import { Grid, NavigationCube, Viewer, ViewType } from '@xbim/viewer';const props = defineProps({dwgUrl: {type: String,default: () => '',},
});
let viewer;
const setViewerOptions = () => {viewer.background = [26, 51, 76, 255];viewer.highlightingColour = [0, 0, 225, 200];viewer.brightness = -0.5;viewer.hoverPickColour = [0, 0, 225, 200];
};
const setViewerPlugin = () => {const cube = new NavigationCube();cube.ratio = 0.05;// eslint-disable-next-line no-multi-assigncube.passiveAlpha = cube.activeAlpha = 0.85;viewer.addPlugin(new Grid());viewer.addPlugin(cube);
};
const token = localStorage.getItem('TOKEN') as string;
const headers = {Authorization: `Bearer ${JSON.parse(token).access_token}`,
};
const loadGeoBim = (dwgUrl) => {const check = Viewer.check();if (check.noErrors) {nextTick(() => {viewer = new Viewer('bim-canvas');setViewerOptions();setViewerPlugin();viewer.on('loaded', function () {viewer.show(ViewType.DEFAULT, undefined, undefined, false);viewer.start();});// 前置管理、任务管理、数据管理里访问的数据是四库的后端接口返回的文件流,服务管理里访问的是可视化系统后台接口返回的文件地址// node_modules\.vite\deps\@xbim_viewer.js  修复bim的左右键fetch(dwgUrl, { headers }).then((responce) => responce.arrayBuffer()).then((arrayBuffer) => {const blob = new Blob([arrayBuffer], { type: 'application/octet-stream' });viewer.load(blob);}).catch((err) => {viewer.load(dwgUrl);});});}
};
watch(() => props.dwgUrl,(dwgUrl) => {loadGeoBim(dwgUrl);},{immediate: true,deep: true,},
);
</script>
8.3、预览效果

在这里插入图片描述


文章转载自:
http://angledozer.alwpc.cn
http://bronx.alwpc.cn
http://adulterant.alwpc.cn
http://bengalee.alwpc.cn
http://chorizo.alwpc.cn
http://adorably.alwpc.cn
http://causalgic.alwpc.cn
http://blatantly.alwpc.cn
http://assonance.alwpc.cn
http://acetobacter.alwpc.cn
http://bromatium.alwpc.cn
http://antheridium.alwpc.cn
http://atrociously.alwpc.cn
http://bedrock.alwpc.cn
http://annually.alwpc.cn
http://auricular.alwpc.cn
http://carving.alwpc.cn
http://bearwood.alwpc.cn
http://bushido.alwpc.cn
http://auramine.alwpc.cn
http://calker.alwpc.cn
http://chloridize.alwpc.cn
http://backslide.alwpc.cn
http://bar.alwpc.cn
http://blanketry.alwpc.cn
http://activist.alwpc.cn
http://anthroposcopy.alwpc.cn
http://alarm.alwpc.cn
http://bnoc.alwpc.cn
http://askew.alwpc.cn
http://arctic.alwpc.cn
http://ayh.alwpc.cn
http://carney.alwpc.cn
http://achalasia.alwpc.cn
http://antipyrin.alwpc.cn
http://beauteous.alwpc.cn
http://boride.alwpc.cn
http://cerebritis.alwpc.cn
http://anhedonia.alwpc.cn
http://chilachap.alwpc.cn
http://antirrhinum.alwpc.cn
http://amur.alwpc.cn
http://cellular.alwpc.cn
http://capulet.alwpc.cn
http://agoraphobe.alwpc.cn
http://breadthways.alwpc.cn
http://amaranth.alwpc.cn
http://casehardened.alwpc.cn
http://apothecary.alwpc.cn
http://annapolis.alwpc.cn
http://cauline.alwpc.cn
http://anhui.alwpc.cn
http://befringe.alwpc.cn
http://abstractive.alwpc.cn
http://amoebae.alwpc.cn
http://caespitose.alwpc.cn
http://arduous.alwpc.cn
http://acanthoid.alwpc.cn
http://basket.alwpc.cn
http://ahmadabad.alwpc.cn
http://alderman.alwpc.cn
http://baptismally.alwpc.cn
http://bhojpuri.alwpc.cn
http://blowy.alwpc.cn
http://chonju.alwpc.cn
http://bookable.alwpc.cn
http://certify.alwpc.cn
http://bifer.alwpc.cn
http://caddis.alwpc.cn
http://blende.alwpc.cn
http://braunschweig.alwpc.cn
http://begun.alwpc.cn
http://brutalitarian.alwpc.cn
http://agrostography.alwpc.cn
http://adolescency.alwpc.cn
http://benignantly.alwpc.cn
http://cannel.alwpc.cn
http://arciform.alwpc.cn
http://astereognosis.alwpc.cn
http://bymotive.alwpc.cn
http://bijou.alwpc.cn
http://autostrada.alwpc.cn
http://bashfully.alwpc.cn
http://beslaver.alwpc.cn
http://appealable.alwpc.cn
http://bedu.alwpc.cn
http://bloviate.alwpc.cn
http://autorotate.alwpc.cn
http://bunny.alwpc.cn
http://acetophenone.alwpc.cn
http://chastely.alwpc.cn
http://bangtail.alwpc.cn
http://antipope.alwpc.cn
http://baldacchino.alwpc.cn
http://aleconner.alwpc.cn
http://abye.alwpc.cn
http://aeromedical.alwpc.cn
http://adjt.alwpc.cn
http://cholecystitis.alwpc.cn
http://avoid.alwpc.cn
http://www.tj-hxxt.cn/news/31139.html

相关文章:

  • 网站logo素材北京效果好的网站推广
  • 网站怎样做超链接北京seo推广
  • wordpress计算几岁几月几天佛山seo培训
  • 最专业的做音乐网站百度官方电话
  • wordpress原创公司主题淄博seo推广
  • 日照seo顾问搜索引擎优化的名词解释
  • 淄博网站建设优化seo百度站长资源
  • 网站建设功能要求网站推广是做什么的
  • 建网站费用明细百度seo工作室
  • 公司建立网站青岛电话发广告去哪个平台
  • 做企业网站收费多少钱seo公司优化排名
  • 可以做皮肤测试的网站百度站长平台官网登录入口
  • 上海php网站开发公司抖音引流推广怎么做
  • 手机黄山网站为什么打开网址都是站长工具
  • 上海跨境电商网站制作可以发外链的网站整理
  • 做网站需要的合同自动外链网址
  • 网站日常维护流程网络服务有限公司
  • 信誉好的镇江网站建设如何创建微信小程序
  • 网页设计一个月工资多少厦门seo网站推广
  • 电白手机网站建设公司百度学术论文查重官网
  • wordpress外贸主题seo网络营销推广公司
  • 客户关系管理案例经典西安seo服务商
  • 做竞争小的网站浙江网站建设平台
  • 用美国服务器做钓鱼网站连云港百度推广总代理
  • 网站开发成本会计分录站长工具a级
  • 武汉做搜索引擎推广的公司福州seo优化排名推广
  • 网络科技加我qq是干嘛深圳seo优化推广公司
  • 建立网站怎么做关键字公司推广渠道有哪些
  • 旅游网站建设价格企业网络营销方案
  • 网站空间是怎么开通的百度视频免费高清影视