HTML5多图片拖拽上传带进度条
前言
昨天利用css2的clip属性实现了网页进度条觉得还不错,但是很多情况下,我们在那些时候用进度条呢,一般网页加载的时候如果有需要可以用,那么问题就来了,怎么才算整个加载完毕呢,是页面主要模块加载完毕,还是window.onload之后算呢,对这些方面,我真不敢随意回答,因业务需求而定,本文想要说的是在图片上传的时候用到的进度条。
效果展示

详细参考请移步至html5demo
HTML5 新增的拖拽相关事件说明
1.ondragover
效果图演示是所看见的可以将文件不仅仅是图片拖拽到该div上边,只要鼠标接触到该div就会触发该事件,演示效果图表现为拖拽区边框变为淡绿色
2.ondragleave
鼠标拖拽文件离开时触发的事件,演示效果图表现为拖拽区边框为灰色
3.ondrop
鼠标在拖拽区按键松开,在此函数内触发读取文件,预览效果,上传服务器操作
HTML5 新增的读取文件api之FileReader/FormData
拖拽区鼠标按键松开,那么就会读取文件流,如果是图片就直接可以看见图片,否则就只显示文件名,用js怎么读取文件流呢,就要用到FileReader对象了,
该对象的很多属性事件比如onload,readAsDataURL,abort,onprogress等详情点击
比如图片上传之后的预览代码如下
var reader = new FileReader();
reader.onload = function (event) {//文件加载完成之后从event对象的result取内容,不论成功失败都会将值放在result中的
var image = new Image();
image.src = event.target.result;
image.width = 250; // a fake resize
holder.appendChild(image);
};
reader.readAsDataURL(file); //表示将文件读取为一段以data:开头的字符串,就是Data URL,它是将小文件直接嵌入
//文档的方案,如果你不写这句,那么就显示不出来因为文档中没有image.src的数据
通过这种方式文件就可以预览了,那么预览完了之后干啥呢,接着就post数据到服务器
那么问题就来了,怎么post数据呢,我这里又没有form表单,也没有iframe,此时就彻底一点都用HTML5的新特性
formData模拟表单数据然后用XMLHttpRequest提交同时可以利用XMLHttpRequest的upload.onprogress事件
实现进度条进度计算。
先上代码
function readfiles(files) {
            //debugger;
            var formData = tests.formdata ? new FormData() : null;
            for (var i = 0; i < files.length; i++) {
                if (tests.formdata) formData.append('file', files[i]);//添加表单元素
                previewfile(files[i]);
            }
            // now post a new XHR request
            if (tests.formdata) {
                var xhr = new XMLHttpRequest();
                if (tests.progress) {//上传进度事件
                    xhr.upload.onprogress = updateProgress;
                } else {
                    console.log("不支持 upload in new XMLHttpRequest");
                }
                xhr.open('POST', 'WebForm1.aspx');//提交服务器处理程序
                xhr.onload = function () {//加载完成之后设置进度条值为100
                    progress.value = 100;
                    progress.innerHTML = 100 + "%";
                };
                xhr.send(formData);
                xhr.onreadystatechange = function () {
                    if (xhr.readyState == 4 && xhr.status == 200) {
                        // alert(xhr.responseText);
                    }
                };
                function updateProgress(event) {
                    //debugger;
                    if (event.lengthComputable) {
                        //event.loaded加载了多少字节  event.total总共多少字节
                        var complete = (event.loaded / event.total * 100 | 0);
                        console.log("complete->", complete);
                        progress.value = 100;
                        progress.innerHTML = 100 + "%";
                    }
                };
            }
        }
还是上后端WebForm1.aspx代码吧,后端处理请求代码
protected void Page_Load(object sender, EventArgs e)
{ HttpFileCollection files = Request.Files;
for (int i = ; i < files.Count; i++)
{
string r = new Random().Next(, ).ToString();
string filename = DateTime.Now.ToString("yyyyMMddhhmmsss") + r +
files[i].FileName.Substring(files[i].FileName.LastIndexOf("."));
string path = Server.MapPath("~/images/") + filename;
files[i].SaveAs(path);
}
Response.Write("upload is completed!");
//Thread.Sleep(1000);
Response.End();
}
总结
该测试遇到一个问题,就是XMLHttpRequest的upload.onprogress事件不是想象中的那样有进度感,不知道是因为服务器是本地的缘故还是该方法调用的方式不对
总是发现只调用了一次然后就是加载的字节流和总的字节流都是一样的,没有一种轮询进度感。该拖拽要先检测浏览器兼容性,切记,如果浏览器没有支持拖拽属性还是
要做兼容处理。最后附上asp.net的HTML5拖拽上传图片带进度条的demo
本人水平有限,如果文中有错误或者需要提建议的,恳请指出,如果觉得还不错请支持一下。
HTML5多图片拖拽上传带进度条的更多相关文章
- HTML5——将图片拖拽上传
		
如下图所示: 代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
 - HTML5 + AJAX ( jQuery版本 ) 文件上传带进度条
		
页面技术:HTML5 + AJAX ( jQuery) 后台技术:Servlet 3.0 服务器:Tomcat 7.0 jQuery版本:1.9.1 Servlet 3.0 代码 package or ...
 - atitit.文件上传带进度条的实现原理and组件选型and最佳实践总结O7
		
atitit.文件上传带进度条的实现原理and组件选型and最佳实践总结O7 1. 实现原理 1 2. 大的文件上传原理::使用applet 1 3. 新的bp 2 1. 性能提升---分割小文件上传 ...
 - atitit. 文件上传带进度条 atiUP 设计 java c# php
		
atitit. 文件上传带进度条 atiUP 设计 java c# php 1. 设计要求 1 2. 原理and 架构 1 3. ui 2 4. spring mvc 2 5. springMVC.x ...
 - jQuery.uploadify-----文件上传带进度条,支持多文件上传的插件
		
借鉴别人总结的uploadify:基于jquery的文件上传插件,支持ajax无刷新上传,多个文件同时上传,上传进行进度显示,控制文件上传大小,删除已上传文件. uploadify有两个版本,一个用f ...
 - Struts2文件上传带进度条,虽然不是很完美
		
好久没有写东西,最近在做个项目,要用到文件h 传的,以前虽然也做上传,但是总觉得不好用 ,现在和队友合作做了一个带进度条的上传,觉得还行~~和大家分享一下. 首先说一下大概是这样实现的,在我们平时的上 ...
 - html5原生js拖拽上传(golang版)
		
一次只能传一个文件,需在main.go同级目录中建一个upload文件夹 main.go package main import ( "fmt" "io" &q ...
 - html5 文件上传 带进度条
		
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
 - bootstarp 多图片上传 带进度条
		
前台代码如下: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head&g ...
 
随机推荐
- vs2012 网站无法使用自定义服务器的解决方法
			
我已经习惯新建一个Asp.net网站时把它挂载在IIS下调试运行,在使用Visual Studio 2012后,新建网站配置启动选项时,自定义服务器居然不可用 原来是Visual Studio 201 ...
 - poj1276--Cash Machine(多背包被判刑了)
			
Cash Machine Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 27804 Accepted: 9915 Des ...
 - android--jenkins+gradle+android自动化构建apk步骤(转)
			
第一步,安装jenkins,这个网上教程挺多的. 第二步,下载并配置gradle.下载地址http://www.gradle.org/ 解压gradle至某路径下,如/usr/local/lib/gr ...
 - /dev/shm(转)
			
引用网上:/dev/shm首先可以看出来/dev/shm是一个设备文件, 可以把/dev/shm看作是系统内存的入口, 可以把它看做是一块物理存储设备,一个tmp filesystem, 你可以通过这 ...
 - C# 使用WinRar命令压缩和解压缩
			
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
 - Objective-C路成魔【2-Objective-C 规划】
			
郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 编译执行O ...
 - SQL Server中TempDB管理(版本存储区的一个example)
			
原文:SQL Server中TempDB管理(版本存储区的一个example) 原文来自: http://blogs.msdn.com/b/sqlserverstorageengine/archive ...
 - SQL开发中容易忽视的一些小地方( 三)
			
原文:SQL开发中容易忽视的一些小地方( 三) 目的:这篇文章我想说说我在工作中关于in和union all 的用法. 索引定义 : 微软的SQL SERVER提供了两种索引:聚集索引(cluster ...
 - 根据自己的需要,把别人开发好的东西搬过来,优化and重构,在优化的过程中,甚至也会弄出一套全新的东西(转)
			
赵海平在今年三月份来到阿里,听毕玄(他现任主管)说去年五六月份就跟赵海平聊上了.有人问:为啥 BAT 三大巨头,你看中了阿里巴巴?在今天现场达一千多人的分享中赵海平给出了回复:“因为百度和腾讯没找我呗 ...
 - cocos2dx 子弹飞作为一个例子来解释解酒效果类CCMotionStreak
			
感谢点评与关注,欢迎转载与分享. 勤奋努力,持之以恒! 在游戏开发中,有时会须要在某个游戏对象上的运动轨迹上实现渐隐效果.比方子弹的运动轨迹,假设不借助引擎的帮助.这样的效果则须要通过大量的图片来实现 ...