|
|
3 settimane fa | |
|---|---|---|
| .vscode | 9 mesi fa | |
| public | 9 mesi fa | |
| src | 3 settimane fa | |
| .gitignore | 9 mesi fa | |
| README.md | 9 mesi fa | |
| auto-imports.d.ts | 9 mesi fa | |
| components.d.ts | 3 settimane fa | |
| index.html | 9 mesi fa | |
| package-lock.json | 3 settimane fa | |
| package.json | 4 settimane fa | |
| pnpm-lock.yaml | 4 settimane fa | |
| tsconfig.app.json | 4 settimane fa | |
| tsconfig.json | 9 mesi fa | |
| tsconfig.node.json | 9 mesi fa | |
| vite.config.ts | 9 mesi fa |
view_file/
├── index.vue # 主组件入口
├── index.less # 样式文件
├── util.js # 工具函数
├── renders.js # 渲染器注册
└── vendors/ # 各类型文件渲染器
├── image/ # 图片渲染
├── other/ # 不支持预览的文件处理
├── pdf/ # PDF渲染
├── pptx/ # PPT渲染
├── text/ # 文本渲染
└── xlsx/ # Excel渲染
└── colz/ # Colz渲染
| 依赖包名称 | 版本 | 用途 |
|---|---|---|
| docx-preview | 0.3.5 | Word 文档预览 |
| exceljs | 4.4.0 | Excel 文件解析 |
| pdfjs-dist | 5.1.91 | PDF 文档预览 |
| html2canvas | 1.4.1 | HTML 转图像 |
| tinycolor2 | 1.6.0 | 颜色处理 |
| x-data-spreadsheet | 1.1.9 | Excel 表格渲染 |
| lodash-es | 4.17.21 | JavaScript 工具库 |
| element-plus | 2.9.8 | el-image 显示图片 |
npm install docx-preview@0.3.5 exceljs@4.4.0 pdfjs-dist html2canvas@1.4.1 tinycolor2@1.6.0 x-data-spreadsheet lodash-es element-plus
yarn add docx-preview@0.3.5 exceljs@4.4.0 pdfjs-dist html2canvas@1.4.1 tinycolor2@1.6.0 x-data-spreadsheet lodash-es element-plus
pnpm add docx-preview@0.3.5 exceljs@4.4.0 pdfjs-dist html2canvas@1.4.1 tinycolor2@1.6.0 x-data-spreadsheet lodash-es element-plus
<template>
<view-file
:file="fileObject"
/>
</template>
<script setup>
import { ref } from 'vue'
import ViewFile from "@/components/view_file/index.vue"
const fileObject = ref({
filename: "示例文件.docx",
type: "docx",
fileBuffer: null // ArrayBuffer类型的文件内容
})
</script>
| 参数名 | 类型 | 默认值 | 说明 | 是否必填 |
|---|---|---|---|---|
| file | Object | {} | 文件对象,包含文件名、类型和文件内容 | 是 |
file 对象属性
| 属性名 | 类型 | 说明 | 是否必填 |
|---|---|---|---|
| filename | String | 文件名称 | 是 |
| type | String | 文件类型(扩展名,如docx、xlsx等) | 是 |
| fileBuffer | ArrayBuffer | 文件内容的二进制数据 | 是 |
<template>
<div>
<input type="file" @change="handleFileChange" />
<view-file
:file="fileObject"
/>
</div>
</template>
<script setup>
import ViewFile from "@/components/view_file/index.vue"
import { readBuffer } from "@/components/view_file/util"
const fileObject = ref({
filename: "",
type: "",
fileBuffer: null
})
const handleFileChange = async (e) => {
const file = e.target.files[0]
if (!file) return
try {
const buffer = await readBuffer(file)
this.fileObject = {
filename: file.name,
type: file.name.split('.').pop().toLowerCase(),
fileBuffer: buffer,
}
} catch (error) {
console.error('文件读取失败', error)
}
}
</script>
| 属性名 | 类型 | 说明 |
|---|---|---|
| filename | String | 文件名称 |
| file | Blob | 文件内容数据 |
<template>
<view-file
:file="fileObject"
/>
</template>
<script setup>
import { ref, onMounted } from 'vue'
import { useRoute } from 'vue-router'
import ViewFile from "@/components/view_file/index.vue"
import { readBuffer } from "@/components/view_file/util"
import axios from 'axios'
const route = useRoute()
const fileObject = ref({
filename: "",
type: "",
fileBuffer: null
})
const fetchFile = async (fileId) => {
try {
const response = await axios.get(`/api/files/${fileId}`)
const name = response.data.filename
// 获取文件名和类型
fileObject.value.filename = name
fileObject.value.type = name.split('.').pop().toLowerCase()
const arrayBuffer = await readBuffer(response.data.file)
fileObject.value.fileBuffer = arrayBuffer
} catch (error) {
console.error('文件获取失败', error)
}
}
onMounted(() => {
// 从路由参数获取文件ID
const fileId = route.params.fileId
if (fileId) {
fetchFile(fileId)
}
})
</script>