vue前端下载文件/docx-preview实现文件预览

一、文件下载

<a :href="http://***文件下载地址" download="">下载</a>

二、文件预览

1.npm安装插件

npm i docx-preview
//此插件容易安装失败 安装了cnpm的小伙伴可使用
cnpm i docx-preview

2.public文件下index.html引入

<script src="https://unpkg.com/jszip/dist/jszip.min.js"></script>

3.vue示例代码

<template>
  <div>
    <div ref="file"></div>
  </div>
</template>

<script>
import Axios from "axios";
import { Loading } from "element-ui";
let docx = require('docx-preview');
let loading;
export default {
  created() {
    loading = Loading.service({ //开始loading加载动画
      lock: true,
      text: "报告文件加载中...",
      background: "rgba(0, 0, 0, 0)",
    });
    this.getPdfCode ()
  },
  
  methods: {
	  getPdfCode () {
	    Axios ({
	      method: 'get',
	      responseType: 'blob', 
	      url: 'http***文档下载路径',
	    }).then(({data}) => {
	      docx.renderAsync(data,this.$refs.file) // 渲染到页面
	      loading.close();//关闭loading
	    })
	  }
   }
}
</script>
### Vue3 实现 DOCX 文件在线预览解决方案 为了实现Vue3 项目中对 DOCX 文件的在线预览功能,可以采用 `docx-preview` 插件来处理前端展示逻辑。此插件能够接收 DOCX 格式的二进制数据并在浏览器端直接渲染文档内容[^3]。 #### 安装依赖库 首先,在项目根目录下执行命令安装必要的 npm 包: ```bash npm install docx-preview axios form-data ``` #### 创建组件结构 创建一个新的 Vue 组件用于封装 DOCX 预览的功能模块。这里假设命名为 `DocxPreview.vue`: ```html <template> <div class="preview-container"> <!-- 加载提示 --> <el-loading v-if="loading"></el-loading> <!-- DOCX 内容容器 --> <div ref="contentContainer" class="docx-content"></div> <!-- 错误消息显示区域 --> <p v-show="error">{{ error }}</p> </div> </template> <script setup lang="ts"> import { ref, onMounted, watch } from 'vue'; import DocxPreview from 'docx-preview'; const props = defineProps({ src: String, }); // 初始化状态变量 let loading = ref(true); let contentContainer = ref(null as HTMLElement | null); let error = ref(''); onMounted(() => { fetchDocument(); }); watch( () => props.src, async (newSrc) => { await fetchDocument(newSrc); } ); async function fetchDocument(url?: string) { try { let response; if (!url && !props.src) throw new Error('No source provided'); const targetUrl = url || props.src; // 获取DOCX文件作为Blob对象 response = await fetch(targetUrl); if (!response.ok) throw new Error(`Failed to load document ${targetUrl}`); const blobData = await response.blob(); // 渲染DOCX内容到页面上 renderDocx(blobData); } catch (err) { console.error(err.message); error.value = err.message; } finally { loading.value = false; } } function renderDocx(data: Blob): void { if (!contentContainer.value) return; // 移除旧的内容以防重复加载 while (contentContainer.value.firstChild) { contentContainer.value.removeChild(contentContainer.value.firstChild); } // 使用docx-preview解析并插入DOM节点 DocxPreview.renderAsync({ data }, contentContainer.value).then((_) => { // 当新文档被成功加载时滚动回顶部位置 setTimeout(() => { window.scrollTo(0, 0); }); }).catch(console.error); } </script> <style scoped> .preview-container { width: 100%; height: auto; min-height: calc(100vh - var(--header-height)); padding-top: 2rem; box-sizing: border-box; } .docx-content { max-width: 80ch; margin-left: auto; margin-right: auto; } </style> ``` 上述代码实现了如下特性: - 支持通过属性传递 DOCX 文件 URL 地址; - 自动检测源地址变化,并重新获取最新版本的数据; - 利用 `fetch()` 函数下载远程资源为 Blob 对象; - 调用 `docx-preview` 的 API 方法完成 DOM 结构构建工作; - 添加了简单的错误处理机制以及视觉反馈(如加载指示器); 每当切换不同的 Word 文档链接时,会触发监听函数自动调整视图回到最上方的位置[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小仙有礼了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值