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.mzph.cn/news/260926.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

webapi文档描述-swagger

最近做的项目使用mvcwebapi&#xff0c;采取前后端分离的方式&#xff0c;后台提供API接口给前端开发人员。这个过程中遇到一个问题后台开发人员怎么提供接口说明文档给前端开发人员,最初打算使用word文档方式进行交流&#xff0c;实际操作中却很少动手去写。为了解决这个问题&…

《推荐系统实践》样章:如何利用用户标签数据

《推荐系统实践》样章&#xff1a;如何利用用户标签数据 推荐系统的目的是联系用户的兴趣和物品&#xff0c;这种联系需要依赖于不同的媒介。GroupLens在文章1中认为目前流行的推荐系统基本上通过三种方式来联系用户兴趣和物品。如图1所示&#xff0c;第一种方式是通过用户喜欢…

STM32 基于正电原子开发板,改换芯片为STM32F103R6,Proteus仿真的一些问题

最近在学STM32&#xff0c;网上收集了一些信息&#xff0c;最后用正点原子的开发板来学习。 MDK的配置请参考原子哥的资料&#xff0c;我主要的学习方法是参考原子哥的开发板与实验案例&#xff0c;改换不一样的芯片&#xff0c;也要做出的一样的效果。但在最基础的入门就遇到…

深入理解闭包系列第二篇——从执行环境角度看闭包

前面的话 本文从执行环境的角度来分析闭包&#xff0c;先用一张图开宗明义&#xff0c;然后根据图示内容对代码进行逐行说明&#xff0c;试图对闭包进行更直观的解释 图示 说明 下面按照代码执行流的顺序对该图示进行详细说明 function foo(){var a 2;function bar(){console.…

VS2017 调用Tesseract

最近在学tesseract&#xff0c;但遇到太多的问题是。 虽然网上有不少的方法&#xff0c;就算是按照tersseract&#xff0c;github上提供的方法也是编译不成功。 问题一大堆。不过我也想到了其它方法最张还是可以用了。 我有2个方法&#xff0c; 方法1, 1&#xff0c;先build t…

在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&…

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接口的集合实现了从一个元素到…

学习Python中用numpy与matplotlib遇到的一些数学函数与函数的绘图

学习Python中的一些数学函数与函数的绘图 主要用到numpy 与 matplotlib 如果有什么不正确&#xff0c;欢迎指教。 图片不知道怎样批量上传&#xff0c;一个一个怎么感觉很小&#xff0c;请见谅 自行复制拷贝&#xff0c;到vs&#xff0c;jupyter notebook, spyder都可以 函…

有这个OCR程序,不用再买VIP了,Python 调用百度OCR API

最近学习&#xff0c;很多东西都是视频&#xff0c;截图后&#xff0c;又想做成文档保存起来。 刚开始不多&#xff0c;打一下字就很快解决了。 随着时间的推移&#xff0c;现在越来越多的图了&#xff0c;管理起来确实不方便&#xff0c;打字有时也不能很快的解决。 所以就…

linux常用命令_Linux常用命令全称

从事IT行业的很多人都会使用Linux常用命令&#xff0c;但是知道这些常用命令全称的人并不多&#xff0c;让我们来看看这些常用命令对应的全称吧&#xff01;必备Linux命令和C语言基础_C语言_嵌入式开发工程师-创客学院​www.makeru.com.cnpwd:print work directory 打印当前目录…

存储程序(1)——MYSQL

MySQL支持把几种对象存放在服务器端供以后使用。这几种对象有一些可以根据情况通过程序代码调用&#xff0c;有一些会在数据表被修改时自动执行&#xff0c;还有一些可以在预定时刻自动执行。它们包括以下几种: 1.存储函数(stored function)。返回一个计算结果&#xff0c;该结…

闯过这 54 关,点亮你的 Git 技能树 (五) - 完结篇

这是一个系列文章&#xff0c;介绍学习 Git 的一个小游戏 - githug&#xff0c;如果你是第一次看到&#xff0c;请先阅读&#xff1a;闯过这 54 关&#xff0c;点亮你的 Git 技能树闯过这 54 关&#xff0c;点亮你的 Git 技能树&#xff08;一&#xff09;闯过这 54 关&#xf…

Jupyter notebook 不安装主题,通过修改css更改 默认字体,字体大小等

目标&#xff1a; Jupyter notebook 又不想改更主题的的情况下&#xff0c;可以通过修改css的目的来达到修改默认的字体&#xff0c;字号心达到可以好的阅读效果。 方法 要修改的css文件目录如下&#xff0c; D:\Anaconda\Lib\site-packages\notebook\static\custom 这个就是…

坚果nuts 加速 官网_【喂你播】坚果手机2020新品发布会来了;三星定向华为手机推以旧换新...

周五喂diu 不只有你们爱的女主播 还有小编呢BGM&#xff1a;Make You Hustle-Croatia Squad坚果手机2020新品发布会来了坚果手机正式宣布&#xff1a;坚果手机2020新品发布会将于10月20日19:30在五棵松M空间举行。根据此前爆料&#xff0c;坚果手机新品或命名为坚果Pro4&#x…

图像处理核函数:之高斯核的生成方法 python

图像处理核函数&#xff1a;之高斯核函数的生成方法 python高斯核函数&#xff08;低通高斯滤波器核&#xff09;高斯分布函数高斯核生成函数代码效果高斯核函数的图像高斯核函数&#xff08;低通高斯滤波器核&#xff09; 最近在看DIP&#xff08;Digital Image Processing)&…

WEB-INFO/lib build path 的jar包问题

为什么80%的码农都做不了架构师&#xff1f;>>> 一、build path&WEB-INFO/lib介绍 build path&#xff1a;可以说是引用&#xff1b; WEB-INFO/lib&#xff1a;可以说是固定在一个地方&#xff1b; eclipse编译项目的时候是根据build path的&#xff0c;如果…

Windows phone 7之页面布局

Windows phone的页面布局方式一般是依赖布局控件实现的&#xff0c;而布局控件有三种Grid&#xff0c;StackPanel和Canvas Grid是网格布局方式&#xff0c;相当于一个表格&#xff0c;有行和列&#xff0c;新建一个Windows phone项目&#xff0c;打开MainPage.xaml&#xff0c;…

苹果电脑删除软件_软件自动开启很烦人?如何彻底关掉开机自动开启的应用程序...

使用Mac的小伙伴有没有这样的烦恼&#xff0c;电脑一开机&#xff0c;一堆烦人的软件就自动开启了&#xff0c;让人很懊恼&#xff0c;如何才能彻底关掉开机自动开启的应用程序&#xff1f;mac开机启动项怎么设置&#xff1f;开机启动项要怎么禁止&#xff1f;今天就带大家解决…