文件预览

Lee 9019416caa fix: 去除无用 pkg há 2 semanas atrás
.vscode b86ee45a25 feat: init há 9 meses atrás
public db03afe701 feat: init há 9 meses atrás
src 7b839aac29 fix: styles há 3 semanas atrás
.gitignore f8766adbb3 fix: readme há 3 semanas atrás
README.md 17bc5306e7 fix: readme há 3 semanas atrás
auto-imports.d.ts 24faf1f253 fix: update há 9 meses atrás
components.d.ts 9019416caa fix: 去除无用 pkg há 2 semanas atrás
index.html b86ee45a25 feat: init há 9 meses atrás
package-lock.json f8766adbb3 fix: readme há 3 semanas atrás
package.json 9019416caa fix: 去除无用 pkg há 2 semanas atrás
pnpm-lock.yaml 9019416caa fix: 去除无用 pkg há 2 semanas atrás
tsconfig.app.json 5645afb37a fix: new wisdom-pptxtojson há 4 semanas atrás
tsconfig.json 24faf1f253 fix: update há 9 meses atrás
tsconfig.node.json b86ee45a25 feat: init há 9 meses atrás
vite.config.ts 0dd2fc96fc fix: vite há 3 semanas atrás

README.md

huijia-viewfile

一个基于 Vue 3 的多格式文件预览组件,支持文档、表格、演示文稿、图片与纯文本/代码的在线预览。

安装

npm i huijia-viewfile

pnpm add huijia-viewfile

yarn add huijia-viewfile

要求:Vue 3(peerDependency)。

快速开始(全局注册)

在入口文件(如 main.ts)中安装插件,并引入样式:

import { createApp } from "vue"
import App from "./App.vue"

import ViewFilePlugin from "huijia-viewfile"
import "huijia-viewfile/style.css"

createApp(App).use(ViewFilePlugin).mount("#app")

在页面中直接使用:

<template>
  <view-file :file="fileObject" />
</template>

<script setup lang="ts">
import { ref } from "vue"

const fileObject = ref({
  filename: "示例文件.pdf",
  type: "pdf",
  fileBuffer: null as ArrayBuffer | null,
})
</script>

Props

file

file 为一个对象,核心字段如下:

字段 类型 必填 说明
filename string 建议 文件名(用于展示与辅助推断类型)
type string 文件扩展名(不带点),如 pdf / docx / xlsx
fileBuffer ArrayBuffer | null 文件二进制内容(ArrayBuffer)
size number 文件大小(仅用于兜底 UI 展示)
name string 兜底文件名(仅用于兜底 UI 展示)

支持的文件类型

  • 文档:docxpdf
  • 表格:xlsx
  • 演示:pptx
  • 图片:gifjpgjpegbmptifftifpngsvg
  • 文本/代码:txtjsonjscssjavapyhtmljsxtstsxxmlmdlog

不支持的类型会展示“该类型文件不支持在线预览”的兜底视图。

使用的开源库

本项目集成了以下优秀的开源库来实现多格式预览:

读取文件并预览

读取本地文件

组件导出了读取工具函数,推荐直接从包名导入:

<template>
  <input type="file" @change="onChange" />
  <view-file :file="fileObject" />
</template>

<script setup lang="ts">
import { ref } from "vue"
import { readBuffer } from "huijia-viewfile"

const fileObject = ref({
  filename: "",
  type: "",
  fileBuffer: null as ArrayBuffer | null,
})

function onChange(e: Event) {
  const input = e.target as HTMLInputElement
  const f = input.files?.[0]
  if (!f) return

  readBuffer(f)
    .then((buffer) => {
      const ext = (f.name.split(".").pop() || "").toLowerCase()
      fileObject.value = {
        filename: f.name,
        type: ext,
        fileBuffer: buffer,
      }
    })
    .catch((err) => {
      console.error("读取文件失败:", err)
    })
}
</script>

从 URL 获取文件并预览

function fetchArrayBuffer(url: string) {
  return fetch(url)
    .then((res) => {
      if (!res.ok) throw new Error(`HTTP ${res.status}`)
      return res.arrayBuffer()
    })
}

拿到 ArrayBuffer 后,填充到 fileObject.fileBuffer 即可。

插槽(图片自定义渲染)

当文件类型为图片时,提供 image 具名插槽,可用于自定义展示与预览交互。

插槽参数:

  • src:当前图片 src
  • srcList:图片列表(当前实现为单图,保留扩展能力)
  • index:当前预览索引
  • file:原始 file 对象
  • preview:预览控制对象 { visible, open, close, next, prev }

示例:

<view-file :file="fileObject">
  <template #image="{ src, preview }">
    <img :src="src" style="max-width: 100%; max-height: 100%" @click="preview.open(0)" />
  </template>
</view-file>

常见问题

  1. fileBuffer 必须是 ArrayBuffer,不要直接传 Blob / File
  2. 传入的 type 建议使用真实扩展名(不带 .),组件会据此选择渲染器。
  3. 预览远端文件时注意 CORS,必要时通过后端代理获取。