在 Vue 中用原生 input file 上傳圖片後預覽

更新於 2024/10/24閱讀時間約 4 分鐘

  先前在開發的專案中,需要一個上傳圖片後可以看即時看到預覽的功能。再加上這個功能在許多地方都會用到,因此試著製作了一個可以獨立運行的組件。

  因為把上傳區跟預覽區分開,因此如果從其它組件取得 previews 資料並放入 previews 陣列中的話,也可以做到直接預覽圖片的功能。


設計的想法是這樣的:

  • 利用原生的 <input type=”file”> 來選擇要上傳的圖片。
  • 另外設定一個 <img> 容器去顯示圖片。
  • 取得所選圖片的URL,放進 <img> 的 src 中。
    • 抓到 <input type=”file”> 上傳的 file 物件
    • 用 URL.createObjectURL() 可以將所選取的 file 物件轉成URL。
    • 把 URL 塞進 src 中。


用Vue來實作:

<template>
<!-- 輸入檔案的地方 -->
<input
ref="uploadFile"
id="uploadFile"
type="file"
name="imgUpload"
@change="changeFile($event)"
/>

<!-- 預覽圖片的地方,因為可能會有多檔上傳,因此用 v-for 來讓多張圖片可以一張一張渲染 -->
<div v-for='file of previews'>
<img
:src="file.url"
:alt="file.name"
v-if="uploadFile !== null"
/>
</div>
</template>

<script setup>
const previews = ref([])
function changeFile(e) {
const uploadFile = e.target.files
//uploadFile是一個陣列,因為有可能會有多檔上傳的情況,因此用陣列的模式去處理。
uploadFile.forEach((file) => {
const item = {}
item.name = '圖片名稱'
item.url = URL.createObjectURL(uploadFile)
previews.value.push(item)
})
}
</script>


在 Vue 中遇上的問題及解決方法


該如何抓到上傳的檔案
  vue 中的 v-model 對於 input:file 是無效的,因此無法用 v-model 的方式取得值,但可以用事件的方式取得,因此這邊使用 @change=”changeFile($event)” 來利用事件取得 input:file 這個元素。並用 e.target.files 來抓到檔案。


參考資料

不用靠後端的 client 端上傳圖片預覽圖

MDN - URL.createObjectURL()

如何用Vue 寫圖片上傳與預覽?


如果有更好的寫法,或是有錯誤之處都歡迎提出!

avatar-img
4會員
15內容數
我是佧佧,歡迎來到我的術式領域。 讓我們一起磨練技術、學習程式, 在前端的領域中不斷成長吧!
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
佧佧的術式領域 的其他內容
Nuxt 是什麼? 總之先學再說! 初見Nuxt,需要的環境?怎麼安裝? 快來看看,從今天開始學 Nuxt !
對於想要嘗試學習前端技術,卻還沒下定決心或不知道是否合適的初心者,六角的體驗營就像是前端開發的新手村,提供基礎的新手教學,讓你對前端有基礎的概念;教你最基本的心法,讓你去打幾隻簡單的怪累積一點經驗值。
本篇最主要是要了解網站前端工程師究竟是什麼?主要工作內容又有哪些?將從三個部份來說明:前端的工作內容、前端所需的軟實力以及前端所需的硬實力。
了解網站的開發流程後再來看看網站開發有哪些角色參與其中吧!
網站的開發流程是如何呢? 透過了解網站開發的流程,能更知道自己的定位以及如何與其它人合作開發網站。
在了解網站是什麼之後,讓我們來了解什麼是網站開發?網站開發究竟在做些什麼呢?
Nuxt 是什麼? 總之先學再說! 初見Nuxt,需要的環境?怎麼安裝? 快來看看,從今天開始學 Nuxt !
對於想要嘗試學習前端技術,卻還沒下定決心或不知道是否合適的初心者,六角的體驗營就像是前端開發的新手村,提供基礎的新手教學,讓你對前端有基礎的概念;教你最基本的心法,讓你去打幾隻簡單的怪累積一點經驗值。
本篇最主要是要了解網站前端工程師究竟是什麼?主要工作內容又有哪些?將從三個部份來說明:前端的工作內容、前端所需的軟實力以及前端所需的硬實力。
了解網站的開發流程後再來看看網站開發有哪些角色參與其中吧!
網站的開發流程是如何呢? 透過了解網站開發的流程,能更知道自己的定位以及如何與其它人合作開發網站。
在了解網站是什麼之後,讓我們來了解什麼是網站開發?網站開發究竟在做些什麼呢?
你可能也想看
Google News 追蹤
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
阿揪西放送的老朋友們應該知道,今年我剛結束了一段大齡留學生活。這段時間偶爾有網友私訊詢問學校申請、開銷和準備流程等問題,我也樂於分享各種細節。其中常提到的建議之一就是:開通一個便捷的網銀帳戶。
Thumbnail
各位使用 Vue.js 開發的小夥伴們,你們都怎麼實作父子層組件資料的雙向綁定呢?如果你還在寫 prop + emit 的話,不妨進來看看吧。
Thumbnail
Quasar Dialog 的 Invoking custom component 很好用,但是有些困擾的地方,一起來看看有甚麼辦法吧。
Thumbnail
切換頁面卡卡有很多種原因,這裡舉的例子只針對元件太大的情境。 除了想辦法拆分外,還有一個方法就是利用 Vue 的 Async Component。
Thumbnail
一開始你先把你的專案push上去後,修改vite.config.ts ,要在裡面新增  base: "/Cart/" (/放自己的專案名稱/) build: {outDir: "docs"}, 接下來你要去你的github setting 裡面 -> Page ->選Deploy fro
Thumbnail
※ 視圖模板 視圖模板(View Templates) 是在 MVC 架構中負責展示數據的 HTML 文件,包含模板語法,用於在渲染時插入實際數據。它們的主要目的是分離數據與展示邏輯,讓代碼更加模塊化和易於維護。 視圖模板設計和使用的核心理念,就是「重複的事情不要重複做、效益最大化、有效利用資源
Thumbnail
你好,在下最近在學習開發web,學了html css js,也得出一些心得,由於網路上已有許多教學,所以我會著重在如何開發出to do List,以及解釋我寫的程式碼。相關的教學我會直接貼網址。如果我有什麼地方出錯,或者是可以寫得更好,歡迎在下方留言,討論。 首先先介紹我的開發環境: 我用了vs
Thumbnail
此為不負責任教學,介面操作依實際情況而有所異動 額外資源參考 [API] 串接 Imgur API 圖床服務,上傳到指定相簿 israynotarray超完整 Express Imgur 套件上傳教學 [前端筆記] 用 axios 串接 imgur API上傳圖片
Thumbnail
平常我們在 html 上常看到的例如 v-for、v-model 等等... 也是VUE已經幫我們定義好的指令,而這次我們可以依這自己的需求來建立。 此功能屬於較進階的功能,因此實戰中會比較少見,市面上還是有不少完善的套件能達到同樣效果,建議可以先往這方面察找
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
阿揪西放送的老朋友們應該知道,今年我剛結束了一段大齡留學生活。這段時間偶爾有網友私訊詢問學校申請、開銷和準備流程等問題,我也樂於分享各種細節。其中常提到的建議之一就是:開通一個便捷的網銀帳戶。
Thumbnail
各位使用 Vue.js 開發的小夥伴們,你們都怎麼實作父子層組件資料的雙向綁定呢?如果你還在寫 prop + emit 的話,不妨進來看看吧。
Thumbnail
Quasar Dialog 的 Invoking custom component 很好用,但是有些困擾的地方,一起來看看有甚麼辦法吧。
Thumbnail
切換頁面卡卡有很多種原因,這裡舉的例子只針對元件太大的情境。 除了想辦法拆分外,還有一個方法就是利用 Vue 的 Async Component。
Thumbnail
一開始你先把你的專案push上去後,修改vite.config.ts ,要在裡面新增  base: "/Cart/" (/放自己的專案名稱/) build: {outDir: "docs"}, 接下來你要去你的github setting 裡面 -> Page ->選Deploy fro
Thumbnail
※ 視圖模板 視圖模板(View Templates) 是在 MVC 架構中負責展示數據的 HTML 文件,包含模板語法,用於在渲染時插入實際數據。它們的主要目的是分離數據與展示邏輯,讓代碼更加模塊化和易於維護。 視圖模板設計和使用的核心理念,就是「重複的事情不要重複做、效益最大化、有效利用資源
Thumbnail
你好,在下最近在學習開發web,學了html css js,也得出一些心得,由於網路上已有許多教學,所以我會著重在如何開發出to do List,以及解釋我寫的程式碼。相關的教學我會直接貼網址。如果我有什麼地方出錯,或者是可以寫得更好,歡迎在下方留言,討論。 首先先介紹我的開發環境: 我用了vs
Thumbnail
此為不負責任教學,介面操作依實際情況而有所異動 額外資源參考 [API] 串接 Imgur API 圖床服務,上傳到指定相簿 israynotarray超完整 Express Imgur 套件上傳教學 [前端筆記] 用 axios 串接 imgur API上傳圖片
Thumbnail
平常我們在 html 上常看到的例如 v-for、v-model 等等... 也是VUE已經幫我們定義好的指令,而這次我們可以依這自己的需求來建立。 此功能屬於較進階的功能,因此實戰中會比較少見,市面上還是有不少完善的套件能達到同樣效果,建議可以先往這方面察找