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