Vue實現文件預覽和下載功能的前端上傳組件

Vue實現文件預覽和下載功能的前端上傳組件

  • 一、前言
    • 1.準備工作
      • 1.1 創建 Vue 組件
      • 1.2 組件說明
    • 2.注意事項


一、前言

在前端開發中,文件上傳和預覽是常見的功能需求之一。本文將介紹如何利用 Vue.js 結合 Element UI 的上傳組件(el-upload)實現文件上傳,并根據文件類型進行預覽或下載的功能。

1.準備工作

首先,確保你的項目中已經引入了 Vue.js 和 Element UI。在這個示例中,我們使用了 el-upload 組件來管理文件上傳。

1.1 創建 Vue 組件

在 Vue 組件中,我們需要實現以下功能:

  • 文件上傳功能
  • 文件預覽功能(針對圖片類型)
  • 文件下載功能(對于其他類型的文件)
<template><div><el-uploadv-model:file-list="fileList"action="你的上傳地址":on-success="handleFileSuccess":on-remove="handleFileRemove":on-error="handleFileError":limit="10":data="fileFormData"name="files":on-preview="openFile"><el-button type="primary">點擊上傳</el-button></el-upload></div>
</template><script>
import axios from 'axios';export default {data() {return {fileList: [], // 上傳文件列表fileFormData: {}, // 額外的上傳參數,如果需要的話imageExtensions: ["jpg", "jpeg", "png", "gif", "bmp"], // 圖片格式后綴};},methods: {async openFile(file) {try {const response = await axios.get(`/bbjApi/system/systemfile/${file.id}`, {responseType: "blob", // 設置響應類型為 blob});const blob = new Blob([response.data], {type: response.headers["content-type"],});const url = window.URL.createObjectURL(blob);// 根據文件類型設置預覽方式const lowerCaseInput = file.name.toLowerCase();if (this.imageExtensions.some((ext) => lowerCaseInput.endsWith("." + ext))) {// 如果是圖片類型,創建彈窗進行預覽this.createImageModal(url);} else {// 其他類型的文件直接下載this.downloadFile(url, file.name);window.URL.revokeObjectURL(url); // 釋放對象 URL}} catch (error) {this.$message.error("打開文件異常,請聯系管理員");}},createImageModal(url) {// 創建彈窗容器const modalContainer = document.createElement("div");modalContainer.style.position = "fixed";modalContainer.style.top = "0";modalContainer.style.left = "0";modalContainer.style.width = "100%";modalContainer.style.height = "100%";modalContainer.style.backgroundColor = "rgba(0, 0, 0, 0.7)";modalContainer.style.zIndex = "9999";modalContainer.style.display = "flex";modalContainer.style.justifyContent = "center";modalContainer.style.alignItems = "center";// 創建圖片元素const imgElement = document.createElement("img");imgElement.src = url;imgElement.style.maxWidth = "80%";imgElement.style.maxHeight = "80%";// 創建關閉按鈕const closeButton = document.createElement("button");closeButton.textContent = "關閉";closeButton.style.position = "absolute";closeButton.style.top = "10px";closeButton.style.right = "10px";closeButton.style.padding = "5px 10px";closeButton.style.backgroundColor = "#409EFF";closeButton.style.border = "none";closeButton.style.cursor = "pointer";closeButton.style.borderRadius = "10px";closeButton.style.color = "#fff";// 點擊關閉按鈕時移除彈窗closeButton.addEventListener("click", () => {document.body.removeChild(modalContainer);window.URL.revokeObjectURL(url); // 釋放對象 URL});// 將圖片和關閉按鈕添加到彈窗容器中modalContainer.appendChild(imgElement);modalContainer.appendChild(closeButton);// 將彈窗容器添加到頁面主體中document.body.appendChild(modalContainer);},downloadFile(url, fileName) {// 創建下載鏈接const link = document.createElement("a");link.href = url;link.setAttribute("download", fileName);document.body.appendChild(link);link.click();document.body.removeChild(link);},handleFileSuccess(response, file, fileList) {// 處理文件上傳成功的回調console.log("文件上傳成功", response);},handleFileRemove(file, fileList) {// 處理文件移除的回調console.log("文件移除", file);},handleFileError(error, file, fileList) {// 處理文件上傳失敗的回調console.error("文件上傳失敗", error);},},
};
</script><style>
/* 可以根據需要添加樣式 */
</style>

1.2 組件說明

  • el-upload 組件配置:配置了文件上傳的基本參數,如上傳地址、成功、移除和失敗的回調函數等。
  • openFile 方法:異步方法,根據文件類型進行預覽或下載。如果是圖片類型,則創建一個模態框顯示圖片;否則,直接下載文件。
  • createImageModal 方法:創建圖片預覽的模態框,包括顯示圖片和關閉按鈕。
  • downloadFile 方法:創建下載鏈接并進行下載。

2.注意事項

  • Blob 對象:用于處理從服務器獲取的二進制數據,如圖片內容。
  • 文件類型判斷:通過文件后綴名判斷文件類型,這里示例了圖片類型的判斷方式。

通過以上方法,你可以在 Vue.js 項目中利用 Element UI 的 el-upload 組件實現文件上傳并根據文件類型進行預覽或下載的功能。這樣的實現不僅提升了用戶體驗,還增加了系統的交互性和可用性。

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

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

相關文章

RAM和ROM的區別

RAM和ROM的區別 RAM和ROM都是用來存東西的&#xff0c;比如我們熟悉的CPU緩存、電腦和手機的內存就是屬于RAM&#xff0c;而固態硬盤、U盤&#xff0c;還有我們買手機時候說的32G、64G的存儲空間&#xff0c;就屬于ROM。RAM和ROM的區別&#xff0c;簡單說就是RAM在斷電之后&am…

正則表達式語法+常用正則表達式

1. 簡介 1> 正則表達式(Regular Expression)是一種文本模式&#xff0c;包括普通字符&#xff08;例如&#xff0c;a 到 z 之間的字母&#xff09;和特殊字符&#xff08;稱為"元字符"&#xff09;&#xff0c;可以用來描述和匹配字符串的特定模式 2> 正則表達…

沙龍回顧|MongoDB如何充當企業開發加速器?

數據不僅是企業發展轉型的驅動力&#xff0c;也是開發者最棘手的問題。前日&#xff0c;MongoDB攜手阿里云、NineData在杭州成功舉辦了“數據驅動&#xff0c;敏捷前行——MongoDB企業開發加速器”技術沙龍。此次活動吸引了來自各行各業的專業人員&#xff0c;共同探討MongoDB的…

Java使用線程實現異步運行

在Java中&#xff0c;實現異步運行的一個常用方式是使用Thread類。下面&#xff0c;我將給出一個詳細且完整的示例&#xff0c;該示例將創建一個簡單的異步任務&#xff0c;該任務將模擬一個耗時的操作&#xff08;比如&#xff0c;模擬網絡請求或文件處理&#xff09;。 1. 使…

【MySQL】mysql訪問

mysql訪問 1.引入MySQL 客戶端庫2.C/C 進行增刪改3.查詢的處理細節4.圖形化界面訪問數據庫4.1下載MYSQL Workbench4.2MYSQL Workbench遠程連接數據庫 點贊&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;關注&#x1f496;&#x1f496; 你的支持是對我最大的鼓勵&a…

第9章:Electron的安全性

在開發Electron應用時&#xff0c;安全性是一個非常重要的考慮因素。由于Electron應用可以訪問Node.js的全部API&#xff0c;以及使用Web技術開發界面&#xff0c;因此需要特別注意安全問題。本章將介紹如何提高Electron應用的安全性&#xff0c;包括禁用不必要的功能、設置內容…

Javascript中Object、Array、String

Object 在JavaScript中&#xff0c;Object 類型是一種復雜的數據類型&#xff0c;用于存儲鍵值對集合。它提供了多種方法來操作這些鍵值對&#xff0c;以及執行其他常見的操作。這里&#xff0c;我列出了一些 Object 類型的常見方法或特性&#xff0c;它們在日常編程中非常有用…

開思通智網-科技快報20240704:全球首個,人工智能之城,AI填報志愿

【本周新進展】 天大開發全球首個可開源片上腦機接口智能交互系統 https://tech.opensnn.com/chip/article/2826792 AI系統繪出“多彩”大腦布線圖 https://news.sciencenet.cn/htmlnews/2024/7/525678.shtm 北京亦莊將建全域人工智能之城 https://tech.opensnn.com/chip/arti…

基于深度學習的文本框檢測

基于深度學習的文本框檢測&#xff08;Text Box Detection&#xff09;是一項重要的計算機視覺任務&#xff0c;旨在從圖像中自動檢測和定位文本區域。它在光學字符識別&#xff08;OCR&#xff09;、自動文檔處理、交通標志識別等領域具有廣泛的應用。以下是關于這一領域的系統…

快遞物流運輸中的鎖控系統優缺點探討

一、物流運輸中鎖控系統的重要性 1.1 保障貨物安全 在物流運輸過程中&#xff0c;貨物安全是物流公司最為關注的問題之一。傳統機械鎖雖然在一定程度上提供了安全保障&#xff0c;但其缺點逐漸暴露&#xff0c;成為物流運輸中的一個痛點。 易被破解&#xff1a;傳統機械鎖通…

drawio打開不顯示,不在當前屏幕的解決方案

如果把drawio拖在外接顯示器&#xff0c;關機前沒有拖回主屏幕&#xff0c;那么下次打開它時如果用的不是原來那個顯示器&#xff0c;它就無法正常顯示。在任務欄上能看到有它&#xff0c;但是就是顯示不出來。 經過卸載和其他的方式沒有解決&#xff0c;就想到了&#xff0c;應…

基于MCU平臺的HMI開發的性能優化與實戰(下)

繼上篇《基于MCU平臺的HMI開發的性能優化與實戰&#xff08;上&#xff09;》深入探討了提升MCU平臺HMI開發效率和應用性能的策略后&#xff0c;本文將專注于NXP i.MX RT1170 MCU平臺的儀表盤開發實踐。我們將重點介紹Qt for MCUs的優化技巧&#xff0c;展示如何通過實際案例應…

Qt:7.QWidget屬性介紹(cursor屬性-光標形狀、font屬性-控件文本樣式、tooltip屬性-控件提示信息)

目錄 一、cursor屬性-光標形狀&#xff1a; 1.1cursor屬性介紹&#xff1a; 1.2獲取當前光標形狀——cursor()&#xff1a; 1.3 設置光標的形狀——setCursor()&#xff1a; 1.4 設置自定義圖片為光標&#xff1a; 二、font屬性-控件文本樣式&#xff1a; 2.1font屬性介紹…

antd-Table-可視化數據滾動

代碼 // 使用方式 const Index () > {useScroll();return <Table />; }import { useEffect, useRef, useState } from react;export const useScroll (() > {let timer;function start() {const [isScroll, setIsScroll] useState(true);const scrollTopRef u…

代碼隨想錄算法訓練營Day59|110.字符串接龍、105.有向圖的完全可達性、106.島嶼的周長

字符串接龍 110. 字符串接龍 (kamacoder.com) 主要參考代碼隨想錄 代碼隨想錄 (programmercarl.com) 目標&#xff1a;得到從beginStr轉變為endStr所需的最少步數 過程&#xff1a;每次變換一個字母&#xff0c;每次變換的結果要在strList中。 對于一個圖來說&#xff0c;…

excel批量修改一列單價的金額并保留1位小數

1.打開表格&#xff0c;要把單價金額變成現在的兩倍&#xff0c;數據如下&#xff1a; 2.把單價這一列粘貼到一個新的sheet頁面&#xff0c;在B2單元格輸入公式&#xff1a;A2*2 然后按enter回車鍵,這時候吧鼠標放到B2單元格右下角&#xff0c;會出現一個黑色的小加號&#xf…

重大更新來襲!!《植物大戰僵尸雜交版V2.1+修改器+融合版》

大家好&#xff01;每個軟件更新總是令人興奮不已。前段時間介紹的《植物大戰僵尸》系列以其獨特的策略玩法和豐富的植物角色&#xff0c;贏得了很多玩家的喜愛。而在今天&#xff0c;這款經典游戲全網最新版本——《植物大戰僵尸&#xff1a;雜交版V2.1》正式推出&#xff0c;…

docker 環境下failed to start lsb故障解決

背景&#xff1a;從深信服超融合遷移虛擬機到VMWARE集群后&#xff0c;遷移后的虛擬機 centos 7 運行systemctl start network ,報錯 Restarting network (via systemctl): Job for network.service failed. See systemctl status network.service and journalctl -xn for d…

Redis組建哨兵模式

主172.17.60.131 從172.17.60.130、172.17.60.129 redis部署 [rootlocalhost app]# tar xf redis-6.2.9.tar.gz [rootlocalhost app]# cd redis-6.2.9/ [rootlocalhost redis-6.2.9]# make MALLOClibc [rootlocalhost redis-6.2.9]# make install PREFIX/usr/local/redis…

Docker 中查看及修改 Redis 容器密碼的實用指南

在使用 Docker 部署 Redis 容器時&#xff0c;有時我們需要查看或修改 Redis 的密碼。本文將詳細介紹如何在 Docker 中查看和修改 Redis 容器的密碼&#xff0c;幫助你更好地管理和維護你的 Redis 實例。 一、查看 Redis 容器密碼 通常在啟動 Redis 容器時&#xff0c;我們會…