搜尋
首頁web前端Vue.jsVue 中如何實作檔案上傳功能?

Vue作為目前前端開發最受歡迎的框架之一,其實作檔案上傳功能的方式也十分簡單優雅。本文將為大家介紹在Vue中如何實作檔案上傳功能。

  1. HTML 部分

在HTML 檔案中新增以下程式碼,建立上傳表單:

<template>
  <div>
    <form ref="uploadForm" 
          enctype="multipart/form-data" 
          class="upload-form" 
          @submit.prevent="submitFile">
      <input type="file" 
             name="file" 
             id="file" 
             class="input-file"
             ref="file"
             @change="handleFileChange" />
      <label for="file" class="btn">选择文件</label>
      <!-- 进度条展示 -->
      <p v-if="showProgress">上传进度:{{ percent }} %</p>
      <button type="submit" 
              class="upload-btn" 
              :disabled="!selectedFile">上传</button>
    </form>
  </div>
</template>

如上程式碼中,使用form 和input 標籤來創建上傳表單。上傳表單中的 name 屬性指定表單中檔案的欄位名稱。 enctype 屬性表示要上傳的檔案的類型,這裡使用了 multipart/form-data 類型。

在 label 標籤中透過 @click.prevent 事件來觸發 input 標籤的點擊事件,從而彈出檔案選擇框。這裡的 @change 事件可以監聽到檔案選擇並且呼叫 handleFileChange 方法來更新表單中的檔案名稱。

  1. JavaScript 部分

在 JavaScript 檔案中,我們需要透過 Vue.js 的自訂元件以及 axios 函式庫來實作檔案上傳。

<script>
import axios from 'axios';

export default {
  data () {
    return {
      selectedFile: null,  // 选中的文件
      showProgress: false,  // 是否展示上传进度条
      percent: 0,    // 上传进度百分比
    }
  },
  methods: {
    handleFileChange (event) {
      this.selectedFile = event.target.files[0];
    },
    submitFile () {
      if (!this.selectedFile) return;
      // 新建 from 对象
      const formData = new FormData();
      formData.append('file', this.selectedFile, this.selectedFile.name);

      this.showProgress = true;
      const config = {
        headers: {
          'Content-Type': 'multipart/form-data'
        },
        onUploadProgress: progressEvent => {
          // 计算上传进度百分比
          this.percent = Math.round((progressEvent.loaded * 100) / progressEvent.total);
        },
      };
      axios.post('/api/upload', formData, config)
        .then((response) => {
          console.log(response);
          this.showProgress = false;  // 移除 progress 条
        })
        .catch((error) => {
          console.log(error);
          this.showProgress = false;
        });
    },
  },
};
</script>

在 methods 中定義 handleFileChange()、submitFile() 方法處理檔案選擇和上傳:

  • handleFileChange 方法中監聽檔案選擇事件並將選取的檔案儲存起來。
  • submitFile 方法中判斷選取的檔案是否存在,不存在則直接回傳。使用 new FormData() 建構一個表單,並將選取的檔案透過 append 方法追加到表單中,注意第三位參數為檔案名稱。 axios.post 透過字串參數指定上傳檔案的API,上傳請求的資料正為該formData 對象,Headers 中的Content-Type 屬性指定了資料類型,這裡使用multipart/form-data 類型,同時透過onUploadProgress 事件監聽上傳進度,以便實現進度條動態展示。

在上述程式碼中,我們使用了 axios 函式庫完成檔案上傳操作。在前端工程的 package.json 檔案中加入 axios 的依賴:

"axios": "^0.19.2"

透過 import axios from 'axios'; 引入並使用。在後台 API 中,使用 Multer 函式庫來處理檔案上傳。 Multer 是一個處理檔案上傳的 Node.js 函式庫,Multer 可以處理檔案並跟隨表單一起傳送。

  1. 後台API 部分
const express = require('express');
const multer = require('multer');
const fs = require('fs');

const app = express();
const upload = multer({ dest: 'uploads/' });

app.post('/api/upload', upload.single('file'), (req, res) => {
  const file = req.file;
  if (!file) {
    const error = new Error('Please upload a file');
    error.httpStatusCode = 400;
    return next(error);
  }
  // 文件重命名
  const oldPath = file.path;
  const newPath = 'uploads/' + file.originalname;
  fs.rename(oldPath, newPath, (err) => {
    if (err) {
      console.error(err);
    }
  });
  res.send('File uploaded successfully');
});

const port = process.env.PORT || 3000;
app.listen(port, () => {
  console.log(`Server listening on port ${port}`);
});

透過Multer 的single 方法指定了上傳檔案的欄位名,同時Multer 也提供了其他方法進行多檔案上傳和檔案類型限制等操作。我們在上傳完成後會把檔案從初始路徑移到 uploads 目錄中,檔案重新命名操作可以讓名稱唯一避免不同檔案名稱上傳覆蓋。

在上述程式碼中,我們使用了 express 函式庫來建立 Node.js 伺服器應用程式。在後台工程中 package.json 檔案中加入以下依賴:

"express": "^4.17.1",
"multer": "^1.4.2"

使用 import / require 語句引入並使用對應模組即可。

  1. 異常狀況處理

在檔案上傳過程中,可能會出現異常狀況,例如檔案大小超限、檔案類型不允許、網路逾時和服務端錯誤等多種因素,我們需要編寫客戶端和服務端對應的異常狀況處理程序。

在客戶端部分,由於我們使用了 axios 庫,可以直接使用 then 和 catch 方法處理上傳請求返回的 Promise 對象,分別處理上傳成功和失敗時的操作。在本文所提供的程式碼中,我們使用了 Promise.catch() 來處理流程執行過程中的例外狀況。在伺服器端,不同的異常情況需要根據實際情況進行不同的處理。

  1. 總結

在本文中,我們介紹如何使用Vue.js 完成檔案上傳操作,包括前端檔案選擇和上傳過程中的進度條動態展示,以及後台APIs 的編寫,同時對上傳過程中可能出現的異常情況進行了處理。

檔案上傳功能是許多 Web 應用程式中不可或缺的一個功能,在 Vue.js 中使用 axios 函式庫和 Multer 函式庫可實現簡單而優雅的上傳流程。

以上是Vue 中如何實作檔案上傳功能?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
vue.js:定義其在網絡開發中的作用vue.js:定義其在網絡開發中的作用Apr 18, 2025 am 12:07 AM

Vue.js在Web開發中的角色是作為一個漸進式JavaScript框架,簡化開發過程並提高效率。 1)它通過響應式數據綁定和組件化開發,使開發者能專注於業務邏輯。 2)Vue.js的工作原理依賴於響應式系統和虛擬DOM,優化性能。 3)實際項目中,使用Vuex管理全局狀態和優化數據響應性是常見實踐。

了解vue.js:主要是前端框架了解vue.js:主要是前端框架Apr 17, 2025 am 12:20 AM

Vue.js是由尤雨溪在2014年發布的漸進式JavaScript框架,用於構建用戶界面。它的核心優勢包括:1.響應式數據綁定,數據變化自動更新視圖;2.組件化開發,UI可拆分為獨立、可複用的組件。

Netflix的前端:React(或VUE)的示例和應用Netflix的前端:React(或VUE)的示例和應用Apr 16, 2025 am 12:08 AM

Netflix使用React作為其前端框架。 1)React的組件化開發模式和強大生態系統是Netflix選擇它的主要原因。 2)通過組件化,Netflix將復雜界面拆分成可管理的小塊,如視頻播放器、推薦列表和用戶評論。 3)React的虛擬DOM和組件生命週期優化了渲染效率和用戶交互管理。

前端景觀:Netflix如何處理其選擇前端景觀:Netflix如何處理其選擇Apr 15, 2025 am 12:13 AM

Netflix在前端技術上的選擇主要集中在性能優化、可擴展性和用戶體驗三個方面。 1.性能優化:Netflix選擇React作為主要框架,並開發了SpeedCurve和Boomerang等工具來監控和優化用戶體驗。 2.可擴展性:他們採用微前端架構,將應用拆分為獨立模塊,提高開發效率和系統擴展性。 3.用戶體驗:Netflix使用Material-UI組件庫,通過A/B測試和用戶反饋不斷優化界面,確保一致性和美觀性。

React與Vue:Netflix使用哪個框架?React與Vue:Netflix使用哪個框架?Apr 14, 2025 am 12:19 AM

NetflixusesAcustomFrameworkcalled“ Gibbon” BuiltonReact,notReactorVuedIrectly.1)TeamSperience:selectBasedonFamiliarity.2)ProjectComplexity:vueforsimplerprojects:reactforforforproproject,reactforforforcompleplexones.3)cocatizationneedneeds:reactoffipicatizationneedneedneedneedneedneeds:reactoffersizationneedneedneedneedneeds:reactoffersizatization needefersmoreflexibleise.4)

框架的選擇:是什麼推動了Netflix的決定?框架的選擇:是什麼推動了Netflix的決定?Apr 13, 2025 am 12:05 AM

Netflix在框架選擇上主要考慮性能、可擴展性、開發效率、生態系統、技術債務和維護成本。 1.性能與可擴展性:選擇Java和SpringBoot以高效處理海量數據和高並發請求。 2.開發效率與生態系統:使用React提升前端開發效率,利用其豐富的生態系統。 3.技術債務與維護成本:選擇Node.js構建微服務,降低維護成本和技術債務。

反應,vue和Netflix前端的未來反應,vue和Netflix前端的未來Apr 12, 2025 am 12:12 AM

Netflix主要使用React作為前端框架,輔以Vue用於特定功能。 1)React的組件化和虛擬DOM提升了Netflix應用的性能和開發效率。 2)Vue在Netflix的內部工具和小型項目中應用,其靈活性和易用性是關鍵。

前端中的vue.js:現實世界的應用程序和示例前端中的vue.js:現實世界的應用程序和示例Apr 11, 2025 am 12:12 AM

Vue.js是一種漸進式JavaScript框架,適用於構建複雜的用戶界面。 1)其核心概念包括響應式數據、組件化和虛擬DOM。 2)實際應用中,可以通過構建Todo應用和集成VueRouter來展示其功能。 3)調試時,建議使用VueDevtools和console.log。 4)性能優化可通過v-if/v-show、列表渲染優化和異步加載組件等實現。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前By尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前By尊渡假赌尊渡假赌尊渡假赌

熱工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版