Vue3+Koa2實(shí)現(xiàn)圖片上傳功能的示例代碼
一、技術(shù)摘要
本次實(shí)現(xiàn)的Demo
使用到的技術(shù)主要有如下:
以上就是我們本次要用到的一些技術(shù)棧,我把官方也給大家貼心的貼出來(lái)了,方便大家學(xué)習(xí)
,任何技術(shù)都離不開(kāi)原生,大家多多舉一反三。
二、圖片上傳流程概述
從概念的角度給大家伙梳理一下圖片上傳要做哪些事情。
1. 前端
首先我們要知道圖片上傳的一個(gè)大概的流程是什么,前端做點(diǎn)啥?后端做點(diǎn)啥?
我用最原生的方式給大家嘮一嘮,首先呢這個(gè)前端有一個(gè)<input id="file_upload" type="file" accept="image/*" />
標(biāo)簽,這個(gè)大家應(yīng)該沒(méi)忘記吧。
一般我們是把這個(gè)input
隱藏,自己寫(xiě)那么幾個(gè)小按鈕,通過(guò)點(diǎn)擊按鈕觸發(fā)input點(diǎn)擊事件(click)
來(lái)選擇要上傳的圖片對(duì)吧。
然后就是回顯的方式,一般有兩種:
- 一種是等待后端處理好之后,
response
返回給我們前端然后去掛載。 - 還有一種就是我們前端解析好之后去顯示,這種比較好,不浪費(fèi)服務(wù)器資源,哈哈哈。
最后的最后就是我們的請(qǐng)求頭要改為multipart/form-data
。
2. 后端
首先是編寫(xiě)我們圖片上傳的接口uploads
。因?yàn)檫@里我演示的是koa
這個(gè)框架,所有后端我們使用到@koa/multur
這個(gè)插件。
設(shè)置我們圖片存放的路徑(文件夾),當(dāng)我們存儲(chǔ)成功之后,再把圖片信息存入我們的數(shù)據(jù)庫(kù)(這一步就不給大家演示了,況且我也就會(huì)個(gè)MongoDB,就不獻(xiàn)丑了),最后返回給前端成功的狀態(tài)碼。
三、項(xiàng)目搭建
這一塊沒(méi)有什么難度,我們簡(jiǎn)單帶過(guò)。
前端
1. 初始化Vue
// 初始化模版 npm init vue@latest // 安裝依賴(lài) npm install // 需要用到 axios HTTP請(qǐng)求 npm install axios --save
后端(koa2)
我千辛萬(wàn)苦找了一個(gè)生成koa的腳手架
,還不錯(cuò)。
1. 全局安裝腳手架
npm install koa-generator -g
2. 初始化項(xiàng)目
// serve是項(xiàng)目名稱(chēng),可以自定義 koa2 serve // 安裝項(xiàng)目依賴(lài) npm install
3. 運(yùn)行
npm run dev
四、開(kāi)始擼代碼
前期工作準(zhǔn)備好之后,開(kāi)始進(jìn)入我們的正題
1. 編寫(xiě)html骨架
我們就寫(xiě)兩個(gè)按鈕,一個(gè)用來(lái)選擇圖片,一個(gè)用來(lái)上傳到后端。
<template> <div class="upload"> <input type="file" accept="image/*" class="upload-file" ref="selectFileRef" /> <div class="upload-btns"> <button class="upload-select">選擇圖片</button> <button class="upload-current">上傳圖片</button> </div> <!-- 用來(lái)回顯我們的圖片 --> <div class="upload-preview"> <img src="" alt="圖片" /> </div> </div> </template> <script setup> </script> <style lang="scss" scoped> .upload-file { display: none; } </style>
2. 定義回顯元素
如果我們的回顯src
是空的話(huà),我們就讓它隱藏。
<div class="upload-preview" v-show="previewUrl"> <img src="" alt="圖片" /> </div> <script> import { ref } from 'vue' const previewUrl = ref('') </script>
3. 編寫(xiě)選擇按鈕邏輯
使用ref
獲取input
DOM元素,通過(guò)點(diǎn)擊選擇圖片
按鈕,觸發(fā)input點(diǎn)擊事件。
<button class="upload-select" @click="selectFileRef.click">選擇圖片</button> ...... ...... // 獲取input元素 const selectFileRef = ref(null)
此時(shí)我們點(diǎn)擊選擇圖片,瀏覽器就會(huì)彈框,就可以選擇我們要上傳的圖片啦!
4. 回顯選擇的圖片
我們使用上邊提到的第一種回顯的方式,這樣會(huì)減少http請(qǐng)求次數(shù),減小服務(wù)器端壓力。這里我們要監(jiān)聽(tīng)input
元素的change
事件,當(dāng)我們確定選擇好圖片之后會(huì)觸發(fā)這個(gè)事件。具體如下:
<input type="file" accept="image/*" class="upload-file" ref="selectFileRef" @change="showImg" /> ...... ...... const showImg = () => { // 獲取我們上傳的元素 const file = selectFileRef.value.files[0] // 把圖片轉(zhuǎn)成base64 const reader = new FileReader() reader.readAsDataURL(file) reader.onload = () => { // 給我們的回顯元素賦值 previewUrl.value = reader.result } }
5. 編寫(xiě)上傳圖片按鈕
這是前端的最后一小步啦,這里我們主要注意請(qǐng)求header
設(shè)置,還有數(shù)據(jù)類(lèi)型{"Content-Type": "multipart/form-data"}
,并且這里我們使用到了axios
。
這里我就把axios
直接拿過(guò)來(lái)用一下啦,以后有時(shí)間,我單獨(dú)好好的和小伙伴們嘮一嘮怎么好好的對(duì)axios進(jìn)行二次封裝。
<button class="upload-current" @click="upload">上傳圖片</button> ...... ...... // 編寫(xiě)上傳文件的處理邏輯方法 const upload = () => { const file = selectFileRef.value.files[0] const formData = new FormData() formData.append('files', file) reader.onload = () => { previewUrl.value = reader.result } // 使用axios發(fā)起http請(qǐng)求 axios({ method: 'post', url: 'http://localhost:3000/uploads', headers: { 'Content-Type': 'multipart/form-data' }, data: formData }).then(res => { //這里是后端返回給我們的結(jié)果 }) }
6. 編寫(xiě)后端代碼
后端不作為我們的重點(diǎn),大概給大家擼一下代碼,主要是編寫(xiě)我們的app.js
文件。還需要安裝一下@koa/multer
模塊。
npm install @koa/multer
編寫(xiě)app.js
const Koa = require("koa"); const Router = require("koa-router"); const multer = require("@koa/multer"); const app = new Koa(); const router = new Router(); // 配置multer中間件 const upload = multer({ storage: multer.diskStorage({ //文件上傳保存的路徑 destination: function (req, file, cb) { let dir = "./public/images" // 查看是否存在,不存在就創(chuàng)建 if (!fs.existsSync(dir)) { fs.mkdirSync(dir, { recursive: true }) } // 這里的路徑必須要存在 cb(null, dir) }, //修改文件名稱(chēng) filename: function (req, file, cb) { const fileName = file.fieldname + "-" + Date.now() + path.extname(file.originalname) cb(null, fileName) } }) }) // 編寫(xiě)圖片上傳的接口 router.post('/uploads', upload.single('files'), async ctx => { const filename = ctx.request.file.filename path = ctx.request.origin + '/images/' + filename // 這里可以去操作數(shù)據(jù)庫(kù)把我們的url存入數(shù)據(jù)庫(kù)中方便使用。 ctx.body = { code: 200, message: '圖片上傳成功', url: path } }) ...... ...... app.use(router.routes(), router.allowedMethods()) app.listen(3000, () => { console.log('This is port 3000...') })
小結(jié)
到此圖片上傳功能完成,大家可以愉快的玩耍啦。其實(shí)大家只要把該注意的點(diǎn)都寫(xiě)到基本就問(wèn)題不大了。
五、總結(jié)
圖片上傳可以說(shuō)是一個(gè)老生常談的問(wèn)題了,對(duì)于小白來(lái)說(shuō)的我,每次看到就頭大,但是這是不對(duì)的,我們應(yīng)該有著一顆敢于探索,敢于學(xué)習(xí)的精神,于是就決心狠狠的給它啃下。當(dāng)你學(xué)會(huì)一項(xiàng)技能的時(shí)候就會(huì)發(fā)現(xiàn),原來(lái)是如此簡(jiǎn)單(這是我作為小白的客觀(guān)評(píng)價(jià),大佬勿噴,哈哈哈)。遇到困難分兩種:一種是知難而退、一種是迎難而上,這也是人和人之間有差距的根本原因。
以上就是Vue3+Koa2實(shí)現(xiàn)圖片上傳功能的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于Vue3 Koa2圖片上傳的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- vue3中el-uplod結(jié)合ts實(shí)現(xiàn)圖片粘貼上傳
- Vue3?+?elementplus實(shí)現(xiàn)表單驗(yàn)證+上傳圖片+?防止表單重復(fù)提交功能
- Vue3?使用v-md-editor如何動(dòng)態(tài)上傳圖片的方法實(shí)現(xiàn)
- vue3.0?移動(dòng)端二次封裝van-uploader實(shí)現(xiàn)上傳圖片(vant組件庫(kù))
- 利用Vue3和element-plus實(shí)現(xiàn)圖片上傳組件
- uniapp上傳本地圖片以及以二進(jìn)制流的方式上傳
- uniapp上傳圖片和上傳視頻的實(shí)現(xiàn)方法
- uniapp小程序上傳圖片功能的實(shí)現(xiàn)
- uniapp+vue3實(shí)現(xiàn)上傳圖片組件封裝功能
相關(guān)文章
詳解vue computed的緩存實(shí)現(xiàn)原理
這篇文章主要介紹了vue computed的緩存實(shí)現(xiàn)原理,幫助大家更好的理解和學(xué)習(xí)使用vue,感興趣的朋友可以了解下2021-04-04Vue中安裝element-ui失敗問(wèn)題原因及解決
Vue中安裝element-ui失敗問(wèn)題原因及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01vue引入element-ui之后,頁(yè)面是空白的問(wèn)題及解決
這篇文章主要介紹了vue引入element-ui之后,頁(yè)面是空白的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01vue使用elementui的el-menu的折疊菜單collapse示例詳解
這篇文章主要介紹了vue使用elementui的el-menu的折疊菜單collapse示例詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-12-12解決vue項(xiàng)目運(yùn)行出現(xiàn)warnings?potentially?fixable?with?the?`--fix
這篇文章主要介紹了解決vue項(xiàng)目運(yùn)行出現(xiàn)warnings?potentially?fixable?with?the?`--fix`?option的報(bào)錯(cuò)問(wèn)題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2021-11-11Vuex中g(shù)etters和actions的使用補(bǔ)充說(shuō)明
這篇文章主要介紹了在Vuex中關(guān)于getters和actions使用的補(bǔ)充作了簡(jiǎn)要說(shuō)明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-09-09vue 路由子組件created和mounted不起作用的解決方法
今天小編就為大家分享一篇vue 路由子組件created和mounted不起作用的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11Vue應(yīng)用中使用xlsx庫(kù)實(shí)現(xiàn)Excel文件導(dǎo)出的詳細(xì)步驟
本文詳細(xì)介紹了如何在Vue應(yīng)用中使用xlsx庫(kù)來(lái)導(dǎo)出Excel文件,包括安裝xlsx庫(kù)、準(zhǔn)備數(shù)據(jù)、創(chuàng)建導(dǎo)出方法、觸發(fā)導(dǎo)出操作和自定義Excel文件等步驟,xlsx庫(kù)提供了強(qiáng)大的API和靈活的自定義選項(xiàng),使得處理Excel文件變得簡(jiǎn)單而高效2024-10-10