Vue3實現文件上傳、下載及預覽全流程詳解(含完整接口調用)

在這里插入圖片描述
在這里插入圖片描述

文章目錄

    • 一、環境準備
      • 1.1 創建Vue3項目
      • 1.2 安裝依賴
      • 1.3 配置Element Plus
    • 二、文件上傳實現
      • 2.1 基礎上傳組件
      • 2.2 自定義上傳邏輯(Axios實現)
    • 三、文件下載實現
      • 3.1 直接下載(已知文件URL)
      • 3.2 后端接口下載(二進制流)
    • 四、文件預覽實現
      • 4.1 圖片預覽
      • 4.2 PDF預覽(使用pdf.js)
      • 4.3 Excel預覽(使用xlsx)
    • 五、完整接口示例
      • 5.1 上傳接口(Node.js示例)
      • 5.2 下載接口(Node.js示例)
    • 六、注意事項
    • 七、完整項目結構
    • 八、總結

一、環境準備

1.1 創建Vue3項目

npm create vue@latest
# 選擇TypeScript、Pinia(可選)、ESLint等配置

1.2 安裝依賴

npm install axios element-plus @element-plus/icons-vue

1.3 配置Element Plus

// main.ts
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'const app = createApp(App)
app.use(ElementPlus)

二、文件上傳實現

2.1 基礎上傳組件

<template><el-uploadclass="upload-demo":action="uploadUrl":headers="headers":on-success="handleSuccess":before-upload="beforeUpload"><el-button type="primary">點擊上傳</el-button><template #tip><div class="el-upload__tip">支持擴展名:.jpg/.png/.pdf,最大5MB</div></template></el-upload>
</template><script setup lang="ts">
import { ref } from 'vue'
import type { UploadProps } from 'element-plus'const uploadUrl = ref('https://api.example.com/upload')
const headers = ref({Authorization: 'Bearer ' + localStorage.getItem('token')
})// 文件預校驗
const beforeUpload: UploadProps['beforeUpload'] = (rawFile) => {const isValidType = ['image/jpeg', 'image/png', 'application/pdf'].includes(rawFile.type)const isLt5M = rawFile.size / 1024 / 1024 < 5if (!isValidType) {ElMessage.error('文件格式不支持!')return false}if (!isLt5M) {ElMessage.error('文件大小不能超過5MB!')return false}return true
}// 上傳成功回調
const handleSuccess: UploadProps['onSuccess'] = (response) => {ElMessage.success('上傳成功')console.log('服務器返回:', response)// 通常返回文件訪問地址
}
</script>

2.2 自定義上傳邏輯(Axios實現)

const customUpload = async (file: File) => {const formData = new FormData()formData.append('file', file)formData.append('userId', '123')try {const { data } = await axios.post('/api/upload', formData, {headers: {'Content-Type': 'multipart/form-data',Authorization: `Bearer ${localStorage.getItem('token')}`}})return data} catch (error) {ElMessage.error('上傳失敗')throw error}
}

三、文件下載實現

3.1 直接下載(已知文件URL)

<template><el-button @click="handleDownload">下載文件</el-button>
</template><script setup lang="ts">
const handleDownload = () => {const link = document.createElement('a')link.href = 'https://api.example.com/files/sample.pdf'link.download = 'filename.pdf' // 設置下載文件名document.body.appendChild(link)link.click()document.body.removeChild(link)
}
</script>

3.2 后端接口下載(二進制流)

const downloadFile = async (fileId: string) => {try {const response = await axios.get(`/api/download/${fileId}`, {responseType: 'blob'})// 創建Blob對象const blob = new Blob([response.data])const url = window.URL.createObjectURL(blob)// 提取文件名const contentDisposition = response.headers['content-disposition']const fileName = contentDisposition?.split('filename=')[1]?.replace(/"/g, '')|| 'download-file'// 創建下載鏈接const link = document.createElement('a')link.href = urllink.download = fileNamedocument.body.appendChild(link)link.click()window.URL.revokeObjectURL(url)document.body.removeChild(link)} catch (error) {ElMessage.error('下載失敗')}
}

四、文件預覽實現

4.1 圖片預覽

<template><el-image :src="imageUrl" :preview-src-list="[imageUrl]"fit="cover"/>
</template>

4.2 PDF預覽(使用pdf.js)

npm install pdfjs-dist @types/pdfjs-dist
<template><div ref="pdfContainer" class="pdf-viewer"></div>
</template><script setup lang="ts">
import { ref, onMounted } from 'vue'
import * as pdfjsLib from 'pdfjs-dist'const props = defineProps<{pdfUrl: string
}>()const pdfContainer = ref<HTMLElement>()onMounted(async () => {const loadingTask = pdfjsLib.getDocument(props.pdfUrl)const pdf = await loadingTask.promisefor (let pageNum = 1; pageNum <= pdf.numPages; pageNum++) {const page = await pdf.getPage(pageNum)const viewport = page.getViewport({ scale: 1.5 })const canvas = document.createElement('canvas')const context = canvas.getContext('2d')!canvas.height = viewport.heightcanvas.width = viewport.widthawait page.render({canvasContext: context,viewport: viewport}).promisepdfContainer.value?.appendChild(canvas)}
})
</script>

4.3 Excel預覽(使用xlsx)

npm install xlsx
<template><el-table :data="excelData"><el-table-column v-for="(col, index) in columns":key="index":prop="col":label="col"/></el-table>
</template><script setup lang="ts">
import { read, utils } from 'xlsx'
import { ref } from 'vue'const excelData = ref([])
const columns = ref([])const previewExcel = async (file: File) => {const data = await file.arrayBuffer()const workbook = read(data)const worksheet = workbook.Sheets[workbook.SheetNames[0]]const jsonData = utils.sheet_to_json(worksheet, { header: 1 })columns.value = jsonData[0]excelData.value = jsonData.slice(1).map(row => {return columns.value.reduce((obj, col, index) => {obj[col] = row[index]return obj}, {})})
}
</script>

五、完整接口示例

5.1 上傳接口(Node.js示例)

// Express 路由
app.post('/api/upload', (req, res) => {const multer = require('multer')const upload = multer({ dest: 'uploads/' })upload.single('file')(req, res, (err) => {if (err) return res.status(500).json({ code: 500, message: '上傳失敗' })// 返回文件信息res.json({code: 200,data: {url: `/files/${req.file.filename}`,originalname: req.file.originalname,size: req.file.size}})})
})

5.2 下載接口(Node.js示例)

app.get('/api/download/:filename', (req, res) => {const filePath = path.join(__dirname, 'uploads', req.params.filename)res.setHeader('Content-Type', 'application/octet-stream')res.setHeader('Content-Disposition', `attachment; filename=${req.params.filename}`)const fileStream = fs.createReadStream(filePath)fileStream.pipe(res)
})

六、注意事項

  1. 安全驗證:所有文件接口需進行身份驗證
  2. 文件大小限制:Nginx需配置client_max_body_size
  3. 文件存儲
    • 敏感文件不要存儲在公開目錄
    • 使用OSS云存儲更佳
  4. 預覽安全
    • 防止XSS攻擊(特別處理HTML文件)
    • 使用CSP內容安全策略

七、完整項目結構

/src
├─api/
│  └─file.ts       # 文件相關接口封裝
├─components/
│  └─FilePreview.vue # 文件預覽組件
├─utils/
│  ├─download.ts   # 下載工具函數
│  └─validation.ts # 文件驗證函數

八、總結

本文全面而詳盡地實現了多項關鍵功能,為開發者提供了從前端到后端、從組件開發到接口對接的全方位解決方案。首先,我們基于Element Plus這一流行的Vue3組件庫,成功構建了一個高效且用戶友好的文件上傳組件。該組件不僅支持文件的快速上傳,還提供了豐富的用戶交互體驗,如進度條顯示、上傳成功/失敗提示等,極大地提升了用戶的使用感受。

在文件處理方面,我們實現了Axios二進制流文件的下載功能。通過Axios的強大網絡請求能力,我們能夠輕松地從服務器獲取二進制文件流,并將其保存到本地或進行進一步的處理。這一功能為文件的異步下載和動態處理提供了有力支持。

為了滿足不同格式文件的預覽需求,我們精心設計了一套PDF/Excel/圖片多格式的預覽方案。該方案能夠自動識別文件類型,并調用相應的預覽組件進行展示。無論是常見的圖片文件,還是復雜的PDF、Excel文檔,都能在我們的系統中得到清晰、準確的預覽效果。

此外,我們還提供了前后端完整接口示例,展示了如何在Vue3前端與后端服務器之間進行高效的數據交互。通過詳細的接口定義和示例代碼,開發者可以快速地理解并實現前后端的數據通信,為項目的快速迭代和部署提供了有力保障。

最后,在生產環境注意事項部分,我們總結了在實際部署過程中可能遇到的問題及解決方案,如性能優化、安全性考慮等。這些寶貴的經驗分享將幫助開發者更好地將項目從開發環境遷移到生產環境,確保系統的穩定性和可靠性。綜上所述,本文不僅提供了豐富的功能實現,還為開發者提供了全面的開發指導和實戰經驗分享。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/70977.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/70977.shtml
英文地址,請注明出處:http://en.pswp.cn/web/70977.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

分布式數據存儲:提升系統彈性與性能的技術之路

分布式數據存儲:提升系統彈性與性能的技術之路 在當今數據爆炸式增長的時代,傳統的單機存儲系統已無法滿足大規模、高并發、低延遲的需求。尤其是在大數據、云計算和物聯網的推動下,數據存儲面臨著前所未有的挑戰。分布式數據存儲應運而生,通過將數據分布在多個物理節點上…

在編譯Linux的內核鏡像和模塊時,必須先編譯內核鏡像,再編譯模塊,順序不可隨意調整的原因

問&#xff1a;在編譯Linux的內核鏡像和模塊時,必須先編譯內核鏡像,再編譯模塊,順序不可隨意調整 答&#xff1a;在編譯 Linux 內核和模塊時&#xff0c;必須先編譯內核鏡像&#xff0c;再編譯模塊&#xff0c;順序不可隨意調整。 原因&#xff1a; 模塊依賴內核的頭文件和符…

免費使用 DeepSeek API 教程及資源匯總

免費使用 DeepSeek API 教程及資源匯總 一、DeepSeek API 資源匯總1.1 火山引擎1.2 百度千帆1.3 阿里百煉1.4 騰訊云 二、其他平臺2.1 華為云2.2 硅基流動 三、總結 DeepSeek-R1 作為 2025 年初發布的推理大模型&#xff0c;憑借其卓越的邏輯推理能力和成本優勢&#xff0c;迅速…

千峰React:案例二

完成對html文檔還有css的引入&#xff0c;引入一下數據&#xff1a; import { func } from prop-types import ./購物車樣式.css import axios from axios import { useImmer } from use-immer import { useEffect } from reactfunction Item() {return (<li classNameacti…

用DeepSeek生成批量刪除處理 PDF第一頁工具

安裝依賴庫 在運行程序之前&#xff0c;請確保安裝所需的庫&#xff1a; pip install pymupdf python-docx Python 程序代碼 import os import fitz # PyMuPDF from docx import Documentdef delete_pdf_first_page(input_path, output_path):"""刪除 PDF…

redis的下載和安裝詳解

一、下載redis安裝包 進入redis官網查看當前穩定版本&#xff1a; https://redis.io/download/發現此時的穩定版本是6.2.4&#xff0c; 此時可以去這個網站下載6.2.4穩定版本的tar包。 暫時不考慮不在windows上使用redis&#xff0c;那樣將無法發揮redis的性能 二、上傳tar…

如何使用 Jenkins 實現 CI/CD 流水線:從零開始搭建自動化部署流程

如何使用 Jenkins 實現 CI/CD 流水線:從零開始搭建自動化部署流程 在軟件開發過程中,持續集成(CI)和持續交付(CD)已經成為現代開發和運維的標準實踐。隨著代碼的迭代越來越頻繁,傳統的手動部署方式不僅低效,而且容易出錯。為了提高開發效率和代碼質量,Jenkins作為一款…

Python基于Django的網絡課程在線學習平臺【附源碼】

博主介紹&#xff1a;?Java老徐、7年大廠程序員經歷。全網粉絲12w、csdn博客專家、掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域和畢業項目實戰? &#x1f345;文末獲取源碼聯系&#x1f345; &#x1f447;&#x1f3fb; 精彩專欄推薦訂閱&#x1f447;&…

Pytorch為什么 nn.CrossEntropyLoss = LogSoftmax + nn.NLLLoss?

為什么 nn.CrossEntropyLoss LogSoftmax nn.NLLLoss&#xff1f; 在使用 PyTorch 時&#xff0c;我們經常聽說 nn.CrossEntropyLoss 是 LogSoftmax 和 nn.NLLLoss 的組合。這句話聽起來簡單&#xff0c;但背后到底是怎么回事&#xff1f;為什么這兩個分開的功能加起來就等于…

rabbitmq 延時隊列

要使用 RabbitMQ Delayed Message Plugin 實現延時隊列&#xff0c;首先需要確保插件已安裝并啟用。以下是實現延時隊列的步驟和代碼示例。 1. 安裝 RabbitMQ Delayed Message Plugin 首先&#xff0c;確保你的 RabbitMQ 安裝了 rabbitmq-delayed-message-exchange 插件。你可…

在 Vue 單文件組件(SFC)中,標簽的顯式關閉與隱式關閉有著重要的區別

一、顯式關閉標簽 1、定義&#xff1a; 所有的 HTML 標簽都必須有一個對應的結束標簽。 自閉合標簽也必須使用 / 來關閉。 <template> <div> <p>這是一個段落</p> <img src"image.png"…

第四屆大數據、區塊鏈與經濟管理國際學術會議

重要信息 官網&#xff1a;www.icbbem.com 時間&#xff1a;2025年3月14-16日 地點&#xff1a;中國-武漢 &#xff08;線上召開&#xff09; 簡介 第四屆大數據、區塊鏈與經濟管理國際學術會議(ICBBEM 2025)&#xff0c;將于2025年3月14-16日在中國湖北省武漢市召開。…

每日十個計算機專有名詞 (7)

Metasploit 詞源&#xff1a;Meta&#xff08;超越&#xff0c;超出&#xff09; exploit&#xff08;漏洞利用&#xff09; Metasploit 是一個安全測試框架&#xff0c;用來幫助安全專家&#xff08;也叫滲透測試人員&#xff09;發現和利用計算機系統中的漏洞。你可以把它想…

使用Docker Compose部署 MySQL8

MySQL 8 是一個功能強大的關系型數據庫管理系統,而 Docker 則是一個流行的容器化平臺。結合使用它們可以極大地簡化 MySQL 8 的部署過程,并且確保開發環境和生產環境的一致性。 安裝 Docker 和 Docker Compose 首先,確保你的機器上已經安裝了 Docker 和 Docker Compose。 …

mamba_ssm和causal-conv1d詳細安裝教程

1.前言 Mamba是近年來在深度學習領域出現的一種新型結構&#xff0c;特別是在處理長序列數據方面表現優異。在本文中&#xff0c;我將介紹如何在 Linux 系統上安裝并配置 mamba_ssm 虛擬環境。由于官方指定mamba_ssm適用于 PyTorch 版本高于 1.12 且 CUDA 版本大于 11.6 的環境…

c++中初始化列表的使用

在 C 中&#xff0c;初始化列表是在構造函數的定義中&#xff0c;用于對類的成員變量進行初始化的一種方式。它緊跟在構造函數的參數列表之后&#xff0c;使用冒號 : 分隔&#xff0c;各成員變量的初始化用逗號 , 分隔。下面詳細介紹初始化列表及其參數的含義。 基本語法 clas…

《Linux系統編程篇》System V信號量實現生產者與消費者問題(Linux 進程間通信(IPC))——基礎篇(拓展思維)

文章目錄 &#x1f4da; **生產者-消費者問題**&#x1f511; **問題分析**&#x1f6e0;? **詳細實現&#xff1a;生產者-消費者****步驟 1&#xff1a;定義信號量和緩沖區****步驟 2&#xff1a;創建信號量****步驟 3&#xff1a;生產者進程****步驟 4&#xff1a;消費者進程…

利用 Python 爬蟲進行跨境電商數據采集

1 引言2 代理IP的優勢3 獲取代理IP賬號4 爬取實戰案例---&#xff08;某電商網站爬取&#xff09;4.1 網站分析4.2 編寫代碼4.3 優化代碼 5 總結 1 引言 在數字化時代&#xff0c;數據作為核心資源蘊含重要價值&#xff0c;網絡爬蟲成為企業洞察市場趨勢、學術研究探索未知領域…

HONOR榮耀MagicBook 15 2021款 獨顯(BOD-WXX9,BDR-WFH9HN)原廠Win10系統

適用型號&#xff1a;【BOD-WXX9】 MagicBook 15 2021款 i7 獨顯 MX450 16GB512GB (BDR-WFE9HN) MagicBook 15 2021款 i5 獨顯 MX450 16GB512GB (BDR-WFH9HN) MagicBook 15 2021款 i5 集顯 16GB512GB (BDR-WFH9HN) 鏈接&#xff1a;https://pan.baidu.com/s/1S6L57ADS18fnJZ1…

c語言實現三子棋小游戲(涉及二維數組、函數、循環、常量、動態取地址等知識點)

使用C語言實現一個三子棋小游戲 涉及知識點&#xff1a;二維數組、自定義函數、自帶函數庫、循環、常量、動態取地址等等 一些細節點&#xff1a; 1、引入自定義頭文件&#xff0c;需要用""雙引號包裹文件名&#xff0c;目的是為了和官方頭文件的<>區分開。…