摘要:多圖片上傳這兩天用原生徒手擼了個插件,寫的不是很完美,在這里先介紹一下傳統(tǒng)的面向過程的寫法,還有很多不足,希望多多指正使用到的技術(shù)使用對象更靈活操作需要發(fā)送的表單文件使用對象允許應(yīng)用程序異步操作本地文件將讀取的文件轉(zhuǎn)換為編碼的字符串文件讀取
Multi多圖片上傳
這兩天用原生徒手擼了個插件,寫的不是很完美,在這里先介紹一下傳統(tǒng)的面向過程的javascript寫法,還有很多不足,希望多多指正
使用到的技術(shù)使用formDate對象:更靈活操作需要發(fā)送的表單文件
使用FileReader對象:允許web應(yīng)用程序異步操作本地文件
FileReader.readAsDataURL()將讀取的文件轉(zhuǎn)換為base64編碼的字符串
FileReader.onload()文件讀取時觸發(fā)該方法
FileReader.onerror()文件讀取錯誤時觸發(fā)該方法
可以參考MDN提供的API https://developer.mozilla.org...
關(guān)鍵函數(shù)//onchange只有在文件發(fā)生改動的時候會調(diào)用 inputFile.onchange = function(){ progress = {value:0,count:this.files.length}; for (var i = 0; i < this.files.length; i++)readerFile(this.files,i); }
function readerFile(files,index){ var reader = new FileReader(); var currFile =files[index]; reader.readAsDataURL(currFile); if(checkFile(currFile,5)){ reader.onload = function(e){ currFile.result = e.target.result; fileData.push({ //格式整理 name:currFile.name, type:currFile.type, size:currFile.size, lastModified:currFile.lastModified, result:currFile.result }); createDOM(currFile) progress.value+=1; var num = progress.value/progress.count*100; if(progress.value>=progress.count){ console.log(fileData.length+"個文件已全部讀取完成!"); } } reader.onerror = function(){ console.log("文件上傳失敗!"); } } }
uploadBtn.onclick = function(){ formData = new FormData(formDom); formData.set("files",JSON.stringify(fileData)); console.log(formData) //封裝完成 暫無接口測試 ajax({ url:"", type:"POST", data:formData, success:function(){ console.log("上傳成功") }, error:function(){ console.log("上傳失敗") } }) }
function checkFile(currFile,max){ var isLegal = true; if(["image/png","image/jpeg","image/jpg","image/gif"].indexOf(currFile.type)==-1){ console.log("文件類型只允許:png、jpg、gif"); isLegal = false; } if(currFile.size > 2048*1024){ console.log("文件大小超出限制,最大允許 2 MB"); isLegal = false; } if(fileExists(currFile.name+currFile.lastModified)){ console.log(currFile.name+",文件重復(fù)"); isLegal = false; } if(fileData.length>=max){ console.log("文件數(shù)量超出,最多上傳"+max+"張圖片"); isLegal = false; } return isLegal; }
function fileExists(checkFlag){ var isRepeat = false; console.log(fileData) fileData.forEach(function(f){ if(f.name + f.lastModified === checkFlag)isRepeat = true; }); return isRepeat; }
我這里是為了更直觀地看到上傳效果
function createDOM(currFile){ var img = new Image(); img.src = currFile.result; var li = document.createElement("li"); li.appendChild(img); ul.appendChild(li); li.key = currFile.name + currFile.lastModified; //給每個縮略圖一個標識 li.addEventListener("click",function(){ var _li = this; //標識當前l(fā)i元素 ul.removeChild(this); fileData.forEach(function(f,i){ if(f.name+f.lastModified == _li.key)fileData.splice(i,1); }) }) }
這里只做post的封裝
function ajax(options){ var defaultOptions = { url:"", type:"", data:null, dataType:"json", success:function(){}, error:function(){} } options = Object.assign({},defaultOptions,options); if(window.XMLHttpRequest){ var xhr = new XMLHttpRequest(); }else{ var xhr = new ActiveXObject("Microsoft.XMLHTTP"); } xhr.onreadystatechange = function(){ if(xhr.readyState === 4){ if(xhr.status === 200){ options.success(); }else{ options.error(); } } } xhr.open(options.type,options.url,true); xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=utf-8"); xhr.send(options.data); }
以上的代碼是全部的js邏輯,如果想更直觀地看到效果,可將下面的html+css代碼進行ctrl+v
/*css*/
好像有點多啊,這是我初步的代碼,封裝好的完整的代碼在我的github上
有興趣的可以去看看,大家多多批評
https://github.com/mqr123/too...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/93988.html
摘要:然鵝,因為是要上傳到七牛,遇到了跨域的問題,嘗試過網(wǎng)上的幾種解決方法,都沒用。一開始以為是一下子上傳太多張的緣故,就把改為,然鵝還是會報錯。。。 其實用這個組件之前,原先是想接著用webuploader的,畢竟用過了,比較熟悉,而且也很好用。然鵝,因為是要上傳到七牛,遇到了跨域的問題,嘗試過網(wǎng)上的幾種解決方法,都沒用。只好用七牛文檔里面的plupload,hhhhhh,官方文檔推薦的,...
摘要:我用做狀態(tài)管理,七牛云做圖床。關(guān)于該組件的其他用法可以在的官方文檔查閱上傳對圖片進行壓縮壓縮圖片的質(zhì)量對圖片進行壓縮壓縮圖片實現(xiàn)起來比較簡單。前端向后端請求上傳。 我用vuex做狀態(tài)管理,七牛云做圖床。 項目地址:多圖片上傳組件 效果展示 showImg(https://segmentfault.com/img/bVbocgG?w=960&h=516); 項目執(zhí)行流程 首先,讓我們來分...
摘要:網(wǎng)址功能單圖多圖上傳圖片上傳預(yù)覽上傳進度條分組上傳,分組查詢新建分組,刪除分組刪除圖片選擇圖片目錄結(jié)構(gòu)前端利用搭建,中引入子組件。實現(xiàn)分組的新增查詢刪除。利用模塊實現(xiàn)刪除文件功能。 公司要寫一些為自身業(yè)務(wù)量身定制的的組件,要基于Vue,寫完后擴展了一下功能,選擇寫圖片上傳是因為自己之前一直對這個功能比較迷糊,所以這次好好了解了一下。演示在網(wǎng)址打開后的show.gif中。 使用技術(shù):Vu...
摘要:哈哈主要還是我嫌麻煩四上傳圖片這里的頁面樣式,圖片壓縮和預(yù)覽都和上面一樣,這里我主要配置一下的,讓接口能夠成功上傳。如果想讓用戶有更好的體驗,可以對圖片進行一下壓縮和本地預(yù)覽。 一、通過Form表單提交上傳 HTML enctype屬性必不可少 上面一種方法通過表單自有屬性進行提交,看似簡單,但是也有其最大的缺點,那就是提交...
摘要:哈哈主要還是我嫌麻煩四上傳圖片這里的頁面樣式,圖片壓縮和預(yù)覽都和上面一樣,這里我主要配置一下的,讓接口能夠成功上傳。如果想讓用戶有更好的體驗,可以對圖片進行一下壓縮和本地預(yù)覽。 一、通過Form表單提交上傳 HTML enctype屬性必不可少 上面一種方法通過表單自有屬性進行提交,看似簡單,但是也有其最大的缺點,那就是提交...
閱讀 3602·2020-12-03 17:42
閱讀 2770·2019-08-30 15:54
閱讀 2228·2019-08-30 15:44
閱讀 575·2019-08-30 14:08
閱讀 974·2019-08-30 14:00
閱讀 1108·2019-08-30 13:46
閱讀 2793·2019-08-29 18:33
閱讀 2910·2019-08-29 14:11