最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue如何實(shí)現(xiàn)文件預(yù)覽和下載功能的前端上傳組件

 更新時(shí)間:2024年09月29日 10:27:51   作者:和燁  
在Vue.js項(xiàng)目中,使用ElementUI的el-upload組件可以輕松實(shí)現(xiàn)文件上傳功能,通過(guò)配置組件參數(shù)和實(shí)現(xiàn)相應(yīng)的方法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

在前端開(kāi)發(fā)中,文件上傳和預(yù)覽是常見(jiàn)的功能需求之一。本文將介紹如何利用 Vue.js 結(jié)合 Element UI 的上傳組件(el-upload)實(shí)現(xiàn)文件上傳,并根據(jù)文件類型進(jìn)行預(yù)覽或下載的功能。

1.準(zhǔn)備工作

首先,確保你的項(xiàng)目中已經(jīng)引入了 Vue.js 和 Element UI。在這個(gè)示例中,我們使用了 el-upload 組件來(lái)管理文件上傳。

1.1 創(chuàng)建 Vue 組件

在 Vue 組件中,我們需要實(shí)現(xiàn)以下功能:

  • 文件上傳功能
  • 文件預(yù)覽功能(針對(duì)圖片類型)
  • 文件下載功能(對(duì)于其他類型的文件)
<template>
  <div>
    <el-upload
      v-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">點(diǎn)擊上傳</el-button>
    </el-upload>
  </div>
</template>

<script>
import axios from 'axios';

export default {
  data() {
    return {
      fileList: [], // 上傳文件列表
      fileFormData: {}, // 額外的上傳參數(shù),如果需要的話
      imageExtensions: ["jpg", "jpeg", "png", "gif", "bmp"], // 圖片格式后綴
    };
  },
  methods: {
    async openFile(file) {
      try {
        const response = await axios.get(`/bbjApi/system/systemfile/${file.id}`, {
          responseType: "blob", // 設(shè)置響應(yīng)類型為 blob
        });
        const blob = new Blob([response.data], {
          type: response.headers["content-type"],
        });
        const url = window.URL.createObjectURL(blob);

        // 根據(jù)文件類型設(shè)置預(yù)覽方式
        const lowerCaseInput = file.name.toLowerCase();
        if (this.imageExtensions.some((ext) => lowerCaseInput.endsWith("." + ext))) {
          // 如果是圖片類型,創(chuàng)建彈窗進(jìn)行預(yù)覽
          this.createImageModal(url);
        } else {
          // 其他類型的文件直接下載
          this.downloadFile(url, file.name);
          window.URL.revokeObjectURL(url); // 釋放對(duì)象 URL
        }

      } catch (error) {
        this.$message.error("打開(kāi)文件異常,請(qǐng)聯(lián)系管理員");
      }
    },
    createImageModal(url) {
      // 創(chuàng)建彈窗容器
      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";

      // 創(chuàng)建圖片元素
      const imgElement = document.createElement("img");
      imgElement.src = url;
      imgElement.style.maxWidth = "80%";
      imgElement.style.maxHeight = "80%";

      // 創(chuàng)建關(guān)閉按鈕
      const closeButton = document.createElement("button");
      closeButton.textContent = "關(guān)閉";
      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";

      // 點(diǎn)擊關(guān)閉按鈕時(shí)移除彈窗
      closeButton.addEventListener("click", () => {
        document.body.removeChild(modalContainer);
        window.URL.revokeObjectURL(url); // 釋放對(duì)象 URL
      });

      // 將圖片和關(guān)閉按鈕添加到彈窗容器中
      modalContainer.appendChild(imgElement);
      modalContainer.appendChild(closeButton);

      // 將彈窗容器添加到頁(yè)面主體中
      document.body.appendChild(modalContainer);
    },
    downloadFile(url, fileName) {
      // 創(chuàng)建下載鏈接
      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) {
      // 處理文件上傳成功的回調(diào)
      console.log("文件上傳成功", response);
    },
    handleFileRemove(file, fileList) {
      // 處理文件移除的回調(diào)
      console.log("文件移除", file);
    },
    handleFileError(error, file, fileList) {
      // 處理文件上傳失敗的回調(diào)
      console.error("文件上傳失敗", error);
    },
  },
};
</script>

<style>
/* 可以根據(jù)需要添加樣式 */
</style>

1.2 組件說(shuō)明

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

2.注意事項(xiàng)

  • Blob 對(duì)象:用于處理從服務(wù)器獲取的二進(jìn)制數(shù)據(jù),如圖片內(nèi)容。
  • 文件類型判斷:通過(guò)文件后綴名判斷文件類型,這里示例了圖片類型的判斷方式。

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

總結(jié)

到此這篇關(guān)于Vue如何實(shí)現(xiàn)文件預(yù)覽和下載功能的前端上傳組件的文章就介紹到這了,更多相關(guān)Vue文件預(yù)覽和下載功能內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue使用lodop實(shí)現(xiàn)打印小結(jié)

    Vue使用lodop實(shí)現(xiàn)打印小結(jié)

    這篇文章主要介紹了Vue使用lodop打印小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 詳解Vue組件之間通信的七種方式

    詳解Vue組件之間通信的七種方式

    這篇文章主要介紹了Vue組件之間通信的七種方式,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-04-04
  • Vue2?模版指令元素綁定事件執(zhí)行順序解析

    Vue2?模版指令元素綁定事件執(zhí)行順序解析

    這篇文章主要為大家介紹了Vue2?模版指令元素綁定事件執(zhí)行順序解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • vue項(xiàng)目中如何排查沒(méi)有使用的變量、js、css和無(wú)關(guān)文件引用等

    vue項(xiàng)目中如何排查沒(méi)有使用的變量、js、css和無(wú)關(guān)文件引用等

    這篇文章主要介紹了vue項(xiàng)目中如何排查沒(méi)有使用的變量、js、css和無(wú)關(guān)文件引用等的相關(guān)資料,通過(guò)示例講解了ESLint配置、Webpack插件使用和手動(dòng)檢查,以優(yōu)化代碼結(jié)構(gòu)和資源管理,需要的朋友可以參考下
    2025-06-06
  • Vue實(shí)現(xiàn)簡(jiǎn)單搜索功能的示例代碼

    Vue實(shí)現(xiàn)簡(jiǎn)單搜索功能的示例代碼

    在vue項(xiàng)目中,搜索功能是我們經(jīng)常需要使用的一個(gè)場(chǎng)景,最常用的是在列表數(shù)據(jù)中搜索一個(gè)想要的,今天的例子就是我們實(shí)現(xiàn)vue從列表數(shù)據(jù)中搜索,希望對(duì)大家有所幫助
    2023-03-03
  • 淺入深出Vue之組件使用

    淺入深出Vue之組件使用

    這篇文章主要給大家介紹了關(guān)于淺入深出Vue之組件使用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Vue具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Vue分別運(yùn)用class綁定和style綁定通過(guò)點(diǎn)擊實(shí)現(xiàn)樣式切換

    Vue分別運(yùn)用class綁定和style綁定通過(guò)點(diǎn)擊實(shí)現(xiàn)樣式切換

    這篇文章主要為大家介紹了Vue分別運(yùn)用class綁定和style綁定通過(guò)點(diǎn)擊實(shí)現(xiàn)樣式切換,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Vue3路由的props案例詳解

    Vue3路由的props案例詳解

    Vue3路由的props作用是將路由參數(shù)或自定義數(shù)據(jù)傳遞給路由組件作為props,布爾值傳遞params參數(shù),對(duì)象傳遞自定義數(shù)據(jù),函數(shù)可以進(jìn)行參數(shù)類型轉(zhuǎn)換和拼接自定義數(shù)據(jù),通過(guò)案例,展示了如何配置路由并使用props傳遞數(shù)據(jù),感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • vue實(shí)現(xiàn)本地存儲(chǔ)添加刪除修改功能

    vue實(shí)現(xiàn)本地存儲(chǔ)添加刪除修改功能

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)本地存儲(chǔ)添加刪除修改功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • vue.js動(dòng)態(tài)修改background-image問(wèn)題

    vue.js動(dòng)態(tài)修改background-image問(wèn)題

    這篇文章主要介紹了vue.js動(dòng)態(tài)修改background-image問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08

最新評(píng)論

华蓥市| 偏关县| 建宁县| 公主岭市| 彰武县| 璧山县| 漳平市| 宜兰县| 南通市| 水富县| 台南市| 韶山市| 宁南县| 怀柔区| 土默特右旗| 广西| 乌兰浩特市| 宁南县| 平遥县| 克山县| 武城县| 融水| 黄骅市| 乐安县| 临朐县| 清流县| 福安市| 华安县| 榆树市| 安新县| 延寿县| 辽中县| 汽车| 新余市| 兴化市| 社会| 中宁县| 方山县| 抚顺市| 张家口市| 安西县|