在開發Web應用時,經常會需要上傳頭像這種操作,在Vue中如何實現呢?其實,我們可以借助Node.js來實現頭像上傳功能。需要注意的是,使用Node.js前,我們需要安裝Node.js和Express模塊。
在Vue中實現頭像上傳必須使用到Vue插件,常見的有vue-upload-component和vue-cropper這兩個插件。其中,vue-upload-component是用于上傳文件的Vue組件,vue-cropper則是用于剪裁圖片的Vue組件。
// 安裝
npm install vue-upload-component vue-cropper --save
在使用過程中,我們可以先用vue-cropper插件進行圖片剪裁。使用vue-cropper插件,我們可以選擇一張圖片進行剪裁,并將剪裁后的圖片上傳至服務器。在main.js中注冊vue-cropper插件:
// main.js
import Vue from 'vue'
import VueCropper from 'vue-cropper'
Vue.use(VueCropper)
在vue上傳頭像中,我們還需要用到vue-upload-component插件,進行文件上傳操作。首先,我們建立一個表單用來選擇文件:
<template>
<form @submit.prevent="uploadAvatar">
<input type="file" ref="fileInput"/>
<button type="submit">上傳頭像</button>
</form>
</template>
在methods中實現uploadAvatar方法:
// methods
methods: {
uploadAvatar() {
// 獲取上傳的文件
const file = this.$refs.fileInput.files[0]
// 插件提供的上傳方法
this.$upload.upload('/upload', file).then(res =>{
// 處理上傳后的結果
})
}
}
在服務端使用Node.js時,我們也需要引入express文件上傳模塊——multer。代碼如下:
// 引入multer模塊
const multer = require('multer')
// 設置儲存路徑
const storage = multer.diskStorage({
destination(req, file, cb) {
cb(null, 'uploads/')
},
filename(req, file, cb) {
// 隨機生成文件名
const fileExt = file.originalname.split('.')[1]
cb(null, `${Date.now()}.${fileExt}`)
}
})
// 上傳配置
const upload = multer({
storage,
})
// 上傳處理
app.post('/upload', upload.single('avatar'), (req, res, next) =>{
const file = req.file
if (!file) {
const error = new Error('Please upload a file')
error.httpStatusCode = 400
return next(error)
}
// 文件上傳成功,返回文件路徑
res.send(`http://www.example.com/${file.filename}`)
})
這樣,我們就實現了頭像上傳功能,通過vue-upload-component插件與multer模塊以及express框架的配合,實現了非常簡單高效的上傳頭像方式。