js實現圖片上傳預覽及進度條

js實現圖片上傳預覽及進度條

原文js實現圖片上傳預覽及進度條?

?? 最近在做圖片上傳的時候,由于產品設計的比較fashion,上網找了比較久還沒有現成的,因此自己做了一個,實現的功能如下:

???? 1:去除瀏覽器<input type="file">默認的樣式;

???? 2:圖片從本地選擇后,立即預覽圖片;

???? 3:使用上傳可以查看上傳進度(本博做的是上傳的百分比,做成進度條類似);

???? 先看效果圖:

?????????????????????????????????????????????

??? 做完的效果圖如下:

?

????????????????

?

??? 首先是去除瀏覽器默認上傳圖片框,這個不是設置的css,再者<input type="file">具有安全性的限制,應該不是那么好操作的。這里使用的方法很簡單,設置<input>為隱藏,再寫個<div>,這個<div>標簽的onclick事件觸發<input>的onclick事件:

???

<input id="localpic1" type="file" style="display:none"><div id="showpic1" οnclick="document.getElementById('localpic1').click();" data="點擊添加海報">點擊添加海報</div>

這個比較簡單,下面看看圖片的預覽:)

? 圖片的預覽利用了<input type="file">的onchange事件,當檢測到圖片替換的時候,顯示替換后的圖片,我這邊是直接插入的<img>標簽,下面是布局:

復制代碼
?<li> ?   ?<font>海報</font> ??   <div class="pic" id="showpic1" οnclick="document.getElementById('localpic1').click();" data="點擊添加海報"> ??????????點擊添加海報 ?????</div> ?????<div id="showpic1Name"></div> ?????<div id="showpic1Size"></div> ?????<div class="info"> ????????<a id="showpic1Up" style="display:none" href="#" οnclick="uploadFile('pic1')">上傳</a> ????????<a id="showpic1Me" style="display:none" href="#">上傳中</a> ????????<a id="showpic1De" href="#" style="display:none" οnclick="deletePic('pic1')">刪除</a> ????????</div> ??</li>
復制代碼

onchange事件:獲取圖片的地址(value),好吧,這個萬惡的各種瀏覽器。然后獲取圖片的信息予以顯示,這個相對還是比較簡單的,聰明的小伙應該一下就明白。

復制代碼
<input id="locallogo" type="file" οnchange="previewImage(this,'showlogo');">
/**圖片的操作*/function previewImage(fileObj,divPreviewId){var allowExtention=".jpg,.bmp,.gif,.png";//允許上傳文件的后綴名document.getElementById("hfAllowPicSuffix").value;var extention=fileObj.value.substring(fileObj.value.lastIndexOf(".")+1).toLowerCase();            var browserVersion= window.navigator.userAgent.toUpperCase();if(allowExtention.indexOf(extention)>-1){ if(fileObj.files){//兼容chrome、火狐7+、360瀏覽器5.5+等,應該也兼容ie10,HTML5實現預覽if(window.FileReader){var reader = new FileReader(); reader.onload = function(e){document.getElementById(divPreviewId).innerHTML="<img src='"+e.target.result+"'>";}  reader.readAsDataURL(fileObj.files[0]);}else if(browserVersion.indexOf("SAFARI")>-1){alert("不支持Safari瀏覽器6.0以下版本的圖片預覽!");}}else if (browserVersion.indexOf("MSIE")>-1){//ie、360低版本預覽if(browserVersion.indexOf("MSIE 6")>-1){//ie6document.getElementById(divPreviewId).innerHTML="<img src='"+fileObj.value+"'>";}else{//ie[7-9]
                    fileObj.select();if(browserVersion.indexOf("MSIE 9")>-1)fileObj.blur();//不加上document.selection.createRange().text在ie9會拒絕訪問var newPreview =document.getElementById(divPreviewId+"New");if(newPreview==null){newPreview =document.createElement("div");newPreview.setAttribute("id",divPreviewId+"New");newPreview.style.width = "150px";newPreview.style.height = "150px";newPreview.style.border="solid 1px #d2e2e2";}newPreview.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale',src='" + document.selection.createRange().text + "')";                            var tempDivPreview=document.getElementById(divPreviewId);tempDivPreview.parentNode.insertBefore(newPreview,tempDivPreview);tempDivPreview.style.display="none";                    }}else if(browserVersion.indexOf("FIREFOX")>-1){//firefoxvar firefoxVersion= parseFloat(browserVersion.toLowerCase().match(/firefox\/([\d.]+)/)[1]);if(firefoxVersion<7){//firefox7以下版本document.getElementById(divPreviewId).innerHTML="<img src='"+fileObj.files[0].getAsDataURL()+"'>";}else{//firefox7.0+ document.getElementById(divPreviewId).innerHTML="<img src='"+window.URL.createObjectURL(fileObj.files[0])+"'>";}}else{document.getElementById(divPreviewId).innerHTML="<img src='"+fileObj.value+"'>";}         }else{alert("僅支持"+allowExtention+"為后綴名的文件!");fileObj.value="";//清空選中文件if(browserVersion.indexOf("MSIE")>-1){                        fileObj.select();document.selection.clear();}                fileObj.outerHTML=fileObj.outerHTML;}document.getElementById(divPreviewId).style.border="";document.getElementById(divPreviewId+"Up").style.display="block";document.getElementById(divPreviewId+"De").style.display="block";showFileInfo(fileObj.files[0],divPreviewId);}//獲取圖片的大小、名稱予以顯示,這里還可以顯示圖片的文件類型function showFileInfo(file,divPreviewId) {var fileName = file.name;var file_typename = fileName.substring(fileName.lastIndexOf('.'), fileName.length);if (file) {var fileSize = 0;if (file.size > 1024 * 1024){fileSize = (Math.round(file.size * 100 / (1024 * 1024)) / 100).toString() + 'MB';}else{fileSize = (Math.round(file.size * 100 / 1024) / 100).toString() + 'KB';}document.getElementById(divPreviewId+"Name").innerHTML = '文件名: ' + file.name;document.getElementById(divPreviewId+"Size").innerHTML = '圖片大小: ' + fileSize;document.getElementById(divPreviewId+"Name").style.display="block";document.getElementById(divPreviewId+"Size").style.display="block";}}
復制代碼

?? 最后一個進入條問題比較難以解決,你要監聽圖片上傳了多少。我覺得大部分人在這里會選擇插件,那樣的話就不用自己管了,但是如果有興趣,繼續往下看吧,I am glad to share my skill with you all!

??? 當我用<form>解決不了,用ajax解決不了的時候(我看ajax有人好像說能上傳文件,這個處理下應該是可以的),就想到了XMLHttpRequest(),嘿嘿。

復制代碼
     function uploadFile(fileId) {document.getElementById("show"+fileId+"Up").style.display="none";document.getElementById("show"+fileId+"Me").style.display="block";var fd = new FormData();fd.append("file", document.getElementById("local"+fileId).files[0]);var xhr = new XMLHttpRequest();//上傳中設置上傳的百分比xhr.upload.addEventListener("progress", function(evt){if (evt.lengthComputable) {var percentComplete = Math.round(evt.loaded * 100 / evt.total);document.getElementById("show"+fileId+"Me").innerHTML = '上傳中'+percentComplete+"%";}else {document.getElementById("show"+fileId+"Me").innerHTML = '無法計算';}}, false);//請求完成后執行的操作xhr.addEventListener("load", function(evt){var message = evt.target.responseText,obj = eval("("+message+")");if(obj.status == 1){$("#"+fileId).val(obj.picName);document.getElementById("show"+fileId+"Me").innerHTML = "已上傳";alert("上傳成功!");}else{alert(obj.message);}}, false);//請求errorxhr.addEventListener("error", uploadFailed, false);//請求中斷xhr.addEventListener("abort", uploadCanceled, false);//發送請求xhr.open("POST", "${ctx}/manage/file/File/uploadPic.htm");xhr.send(fd);}function uploadFailed(evt) {alert("上傳出錯.");}function uploadCanceled(evt) {alert("上傳已由用戶或瀏覽器取消刪除連接.");}
復制代碼

? ok,最后一個問題算是搞定了,在firefox,ie9,chrome下測試沒有問題,版本應該都不高,其他的就不管了哈。 ? 本人第一次發博,各位大俠手下留情~

?

posted on 2014-01-10 13:14 NET未來之路 閱讀(...) 評論(...) 編輯 收藏

轉載于:https://www.cnblogs.com/lonelyxmas/p/3513554.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/260926.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260926.shtml
英文地址,請注明出處:http://en.pswp.cn/news/260926.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

webapi文檔描述-swagger

最近做的項目使用mvcwebapi&#xff0c;采取前后端分離的方式&#xff0c;后臺提供API接口給前端開發人員。這個過程中遇到一個問題后臺開發人員怎么提供接口說明文檔給前端開發人員,最初打算使用word文檔方式進行交流&#xff0c;實際操作中卻很少動手去寫。為了解決這個問題&…

《推薦系統實踐》樣章:如何利用用戶標簽數據

《推薦系統實踐》樣章&#xff1a;如何利用用戶標簽數據 推薦系統的目的是聯系用戶的興趣和物品&#xff0c;這種聯系需要依賴于不同的媒介。GroupLens在文章1中認為目前流行的推薦系統基本上通過三種方式來聯系用戶興趣和物品。如圖1所示&#xff0c;第一種方式是通過用戶喜歡…

應用程序創建自己的奔潰轉儲(crash dump)文件

1、注冊自定義的UnhandledExceptionFilter&#xff0c;C/C Runtime Library下需要注意自定義handler被移除&#xff08;hook kernel32.dll的SetUnhandledExceptionFilter使它返回一個空指針即可&#xff09;。 PTOP_LEVEL_EXCEPTION_FILTER v_prevUnhandledExceptionFilter;…

jqMobi + Android 試手

忙活的一個晚上&#xff0c;搞定了一個界面&#xff0c;主要在滾動條和風格上花了不少時間&#xff0c;jqMobi的文檔真的少的可憐&#xff0c;希望文檔可以多點&#xff0c;以下是幾份參考資料&#xff1a; 最新的Api參考&#xff1a;http://www.shareach.com/jq/一些簡單的范例…

STM32 基于正電原子開發板,改換芯片為STM32F103R6,Proteus仿真的一些問題

最近在學STM32&#xff0c;網上收集了一些信息&#xff0c;最后用正點原子的開發板來學習。 MDK的配置請參考原子哥的資料&#xff0c;我主要的學習方法是參考原子哥的開發板與實驗案例&#xff0c;改換不一樣的芯片&#xff0c;也要做出的一樣的效果。但在最基礎的入門就遇到…

深入理解閉包系列第二篇——從執行環境角度看閉包

前面的話 本文從執行環境的角度來分析閉包&#xff0c;先用一張圖開宗明義&#xff0c;然后根據圖示內容對代碼進行逐行說明&#xff0c;試圖對閉包進行更直觀的解釋 圖示 說明 下面按照代碼執行流的順序對該圖示進行詳細說明 function foo(){var a 2;function bar(){console.…

沒事寫著玩 系列之 JQ連連看(很丑陋,很初級)

說明:(圖片自備, 名稱為 jpg[0,2].jpg class為( one two three)對應 前面的 0,1,2) <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://ww…

VS2017 調用Tesseract

最近在學tesseract&#xff0c;但遇到太多的問題是。 雖然網上有不少的方法&#xff0c;就算是按照tersseract&#xff0c;github上提供的方法也是編譯不成功。 問題一大堆。不過我也想到了其它方法最張還是可以用了。 我有2個方法&#xff0c; 方法1, 1&#xff0c;先build t…

最少步數----深搜

最少步數 時間限制&#xff1a;3000 ms | 內存限制&#xff1a;65535 KB難度&#xff1a;4描述這有一個迷宮&#xff0c;有0~8行和0~8列&#xff1a; 1,1,1,1,1,1,1,1,1 1,0,0,1,0,0,1,0,1 1,0,0,1,1,0,0,0,1 1,0,1,0,1,1,0,1,1 1,0,0,0,0,1,0,0,1 1,1,0,1,0,1,0,0,1 1,1,0,1…

由單例模式造成的內存泄漏

使用單例模式時&#xff0c;有時候不小心&#xff0c;就會很容易造成內容泄漏&#xff0c;如下代碼所示&#xff1a;public class SingleInstance { private static volatile SingleInstance instance; private Context context; private SingleInstance(Context context) {thi…

在windows上安裝OpenCV

在windows上安裝OpenCV&#xff0c;官方提供的教程&#xff0c;我翻譯了一下。如有不正解&#xff0c;請指正 使用git-bash&#xff08;版本> 2.14.1&#xff09;和cmake&#xff08;版本> 3.9.1&#xff09;安裝 1.您必須下載cmake&#xff08;版本> 3.9.1&…

CFile、CStdioFile、FILE和其他文件操作(轉)

CFile //創建/打開文件 CFile file; file.Open(_T("test.txt"),CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite);//文件打開模式可組合使用&#xff0c;用“|”隔開&#xff0c;常用的有以下幾種&#xff1a; //CFile::modeCreate&#xff1a;以新建…

Oracle修改redo log大小的方法

目的:修改當前在線日志從默認50M增加至512M。1.查看當前日志組的狀態SQL> select group#,members,bytes/1024/1024,status from v$log;GROUP# MEMBERS BYTES/1024/1024 STATUS---------- ---------- --------------- ----------------1 1 50 INACT…

算法競賽入門經典 第一章 上機練習(C++代碼)

//平均數&#xff08;average&#xff09; //輸入3個整數&#xff0c;輸出它們的平均值&#xff0c;保留3位小數。 #include<iostream> #include<iomanip> using namespace std; int main() { int a,b,c; cin>>a>>b>>c; double average(abc)/3; …

CMake 編譯 OpenCV 項目,不是編譯OpenCV, 用了之后才知道CMake也太好用了。

新建一個 CMakeList.txt 復制下面代碼&#xff0c;并保存 cmake_minimum_required (VERSION 3.0)PROJECT(Chapter2)set (CMAKE_CXX_STANDARD 11)IF(EXISTS ${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)conan_basic_setup() E…

Java Ajax jsonp 跨域請求

2019獨角獸企業重金招聘Python工程師標準>>> 1. 什么是JSONP 一般來說位于 server1.example.com 的網頁無法與不是 server1.example.com的服務器溝通&#xff0c;而 HTML 的<script> 元素是一個例外。利用 <script> 元素的這個開放策略&#xff0c;網頁…

對IEnumerableT,IDictionaryTkey,TValue,ICollectionT,IListT的總結

1、IEnumerable<T>接口和IEnumerable接口 實現了IEnumerable接口的集合表明該集合能夠提供一個enumerator(枚舉器)對象&#xff0c;支持當前的遍歷集合。IEnumerable接口只有一個成員GetEnumerator()方法。 IEnumerator接口實現了IEnumerator接口的集合實現了從一個元素到…

Backup--修改實例級別是否使用壓縮備份的默認值

-- --修改實例級別是否使用壓縮備份的默認值 USE master; GO EXEC sp_configure backup compression default, 1; RECONFIGURE WITH OVERRIDE;轉載于:https://www.cnblogs.com/TeyGao/p/3519952.html

Java學習——Java運算符

位運算符 A 0011 1100 B 0000 1101 ----------------- A&b 0000 1100 A | B 0011 1101 A ^ B 0011 0001A << 2 1111 0000A >>> 2 0000 1111 ~A 1100 0011 例子 package import_test;public class Employee {public static void main(String args[])…

學習Python中用numpy與matplotlib遇到的一些數學函數與函數的繪圖

學習Python中的一些數學函數與函數的繪圖 主要用到numpy 與 matplotlib 如果有什么不正確&#xff0c;歡迎指教。 圖片不知道怎樣批量上傳&#xff0c;一個一個怎么感覺很小&#xff0c;請見諒 自行復制拷貝&#xff0c;到vs&#xff0c;jupyter notebook, spyder都可以 函…