js實(shí)現(xiàn)上傳圖片功能
前端上傳圖片的原理是:運(yùn)用input type=“file”的標(biāo)簽獲取圖片,再使用FileReader這個(gè)對象 new 一個(gè)實(shí)例,通過這個(gè)對象的readAsDataURL()方法讀取file標(biāo)簽獲取的圖片并轉(zhuǎn)換為base64格式,完成之后通過ajax之類的方式傳到后臺。
HTML
需要一個(gè)input type="file" 的標(biāo)簽 如果需要預(yù)覽的話可以再加一個(gè)img標(biāo)簽
<div class="warp"> <div class="warp-content">點(diǎn)擊上傳</div> <input type="file" id="file" /> </div> <img src="" />
JS
一、圖片上傳需要檢測上傳的圖片是否變化,所以這里選擇js的onchange事件.先獲取input,img的dom元素,在input type=‘file'的demo元素下,有一個(gè)files屬性,里面是我們上傳的文件信息,打印一下,就可以看到上傳文件的名字,類型等信息。
var file = document.getElementById('file'); var image = document.querySelector("img"); file.onchange = function() { var fileData = this.files[0];//這是我們上傳的文件 }
二、然后運(yùn)用 FileReader 這個(gè)對象,F(xiàn)ileReader主要用于將文件內(nèi)容讀入內(nèi)存,通過一系列異步接口,可以在主線程中訪問本地文件。使用FileReader對象,web應(yīng)用程序可以異步的讀取存儲在用戶計(jì)算機(jī)上的文件(或者原始數(shù)據(jù)緩沖)內(nèi)容,可以使用File對象或者Blob對象來指定所要處理的文件或數(shù)據(jù)。這里用到了里面的 readAsDataURL 這個(gè)方法,它能把文件用base64格式讀出。
使用方法
var reader = new FileReader(); reader.readAsDataURL(fileData);//異步讀取文件內(nèi)容,結(jié)果用data:url的字符串形式表示 /*當(dāng)讀取操作成功完成時(shí)調(diào)用*/ reader.onload = function(e) { console.log(e); //查看對象屬性里面有個(gè)result屬性,屬性值,是一大串的base64格式的東西,這個(gè)就是我們要的圖片 console.log(this.result);//取得數(shù)據(jù) 這里的this指向FileReader()對象的實(shí)例reader image.setAttribute("src", this.result)//賦值給img標(biāo)簽讓它顯示出來 }
FileReader對象的屬性和事件
FileReader對象 官方文檔
三、第二步操作完成我們就可以上傳圖片的功能了,用戶再使用時(shí)我們不能保證用戶上傳的是什么東西,圖片還是視頻,需要判斷一下上傳的文件類型 input type=‘file'的demo元素下,有一個(gè)files屬性它里面有文件類型的信息,我們可以通過這屬性來判斷上傳文件類型。(reader.onload里面通過this.result可以獲得圖片的base64格式,把它賦值給一個(gè)變量傳到后臺,這樣就完成了一個(gè)圖片上傳)
var file = document.getElementById('file'); var image = document.querySelector("img"); file.onchange = function() { var fileData = this.files[0];//獲取到一個(gè)FileList對象中的第一個(gè)文件(File 對象),是我們上傳的文件 var pettern = /^image/; console.info(fileData.type) if (!pettern.test(fileData.type)) { alert("圖片格式不正確"); return; } var reader = new FileReader(); reader.readAsDataURL(fileData);//異步讀取文件內(nèi)容,結(jié)果用data:url的字符串形式表示 /*當(dāng)讀取操作成功完成時(shí)調(diào)用*/ reader.onload = function(e) { console.log(e); //查看對象 console.log(this.result);//要的數(shù)據(jù) image.setAttribute("src", this.result) } }
全部代碼:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <style type="text/css"> .warp { display: inline-block; vertical-align: bottom; position: relative; } .warp-content { border: 1px solid red; width: 150px; height: 150px; line-height: 150px; text-align: center; } input { position: absolute; top: 0; left: 0; border: 1px solid red; width: 150px; height: 150px; opacity: 0; cursor: pointer; } img { width: 300px; height: 300px; border: 1px solid red; margin-top: 50px; vertical-align: bottom; } </style> </head> <body> <div class="fileBox"> <div class="warp"> <div class="warp-content">點(diǎn)擊上傳</div> <input type="file" id="file" /> </div> <img src="" /> </div> <script type="text/javascript"> var file = document.getElementById('file'); var image = document.querySelector("img"); file.onchange = function() { var fileData = this.files[0];//獲取到一個(gè)FileList對象中的第一個(gè)文件( File 對象),是我們上傳的文件 var pettern = /^image/; console.info(fileData.type) if (!pettern.test(fileData.type)) { alert("圖片格式不正確"); return; } var reader = new FileReader(); reader.readAsDataURL(fileData);//異步讀取文件內(nèi)容,結(jié)果用data:url的字符串形式表示 /*當(dāng)讀取操作成功完成時(shí)調(diào)用*/ reader.onload = function(e) { console.log(e); //查看對象 console.log(this.result);//要的數(shù)據(jù) 這里的this指向FileReader()對象的實(shí)例reader image.setAttribute("src", this.result) } } </script> </body> </html>
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- JS實(shí)現(xiàn)上傳圖片的三種方法并實(shí)現(xiàn)預(yù)覽圖片功能
- js實(shí)現(xiàn)上傳圖片預(yù)覽的方法
- 上傳圖片預(yù)覽JS腳本 Input file圖片預(yù)覽的實(shí)現(xiàn)示例
- 微信JSSDK上傳圖片
- js實(shí)現(xiàn)上傳圖片之上傳前預(yù)覽圖片
- js實(shí)現(xiàn)ctrl+v粘貼上傳圖片(兼容chrome、firefox、ie11)
- Javascript 驗(yàn)證上傳圖片大小[客戶端]
- jsp中實(shí)現(xiàn)上傳圖片即時(shí)顯示效果功能
- JS上傳圖片前的限制包括(jpg jpg gif及大小高寬)等
- js 上傳圖片預(yù)覽問題
相關(guān)文章
JavaScript setinterval延遲一秒解決方案
這篇文章主要介紹了JavaScript setinterval延遲一秒解決方案,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09JS實(shí)現(xiàn)兼容各種瀏覽器的獲取選擇文本的方法【測試可用】
這篇文章主要介紹了JS實(shí)現(xiàn)兼容各種瀏覽器的獲取選擇文本的方法,可實(shí)現(xiàn)鼠標(biāo)拖動選擇文本的同時(shí),下方顯示區(qū)同步實(shí)時(shí)顯示選中內(nèi)容的功能,涉及javascript響應(yīng)鼠標(biāo)事件及頁面元素動態(tài)操作技巧,需要的朋友可以參考下2016-06-06javascript操作cookie的文章(設(shè)置,刪除cookies)
一篇javascript處理cookie的文章,腳本之家之前發(fā)布過很多這樣的文章。2010-04-04小程序獲取手機(jī)驗(yàn)證碼倒計(jì)時(shí)的方法
這篇文章主要為大家詳細(xì)介紹了小程序獲取手機(jī)驗(yàn)證碼倒計(jì)時(shí)的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下<BR>2022-08-08ExtJs中g(shù)ridpanel分組后組名排序?qū)嵗a
這篇文章主要介紹了ExtJs中g(shù)ridpanel分組后組名排序?qū)嵗a,有需要的朋友可以參考一下2013-12-12JS實(shí)現(xiàn)網(wǎng)頁時(shí)鐘特效
這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)網(wǎng)頁時(shí)鐘特效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03使用Turn.js實(shí)現(xiàn)翻書效果的完整步驟
最近項(xiàng)目經(jīng)理我個(gè)項(xiàng)目練練手,其項(xiàng)目需求是要實(shí)現(xiàn)翻書效果,下面這篇文章主要給大家介紹了關(guān)于使用Turn.js實(shí)現(xiàn)翻書效果的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12