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 = 0; i < files.Count; i++)
            {
                string r = new Random().Next(0, 9).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

本人水平有限,如果文中有错误或者需要提建议的,恳请指出,如果觉得还不错请支持一下。

时间: 2024-10-27 14:16:31

HTML5多图片拖拽上传带进度条的相关文章

HTML5——将图片拖拽上传

如下图所示: 代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <style type="text/css"> #div1{width:200px;height:200px;background:red;} </style> <script type="te

HTML5 + AJAX ( jQuery版本 ) 文件上传带进度条

页面技术:HTML5 + AJAX ( jQuery) 后台技术:Servlet 3.0 jQuery版本:1.9.1 后台Servlet代码这里就省略了,使用的是 AJAX请求遭遇未登录和Session失效的解决方案 这篇文章里面的后台Servlet.所以这里只看前台的JS代码. 首先HTML5用AJAX提交数据先要学习一个HTML5新增加的对象:FormData  FormData 对象可以使用append 方法进行 key - value的数据添加,与以前我们常用的json不同的就是可以异

图片拖拽上传至服务器

今天遇到一个新的问题,就是图片拖拽上传至服务器,一般,我们会想到使用ajax,但是现在问题是ajax默认是没有提交事件的,也就是说,我们拖拽上传图片后,没法将上传的图片信息发送到服务器,这时候就要模拟form表单的提交了. 既然要上传,这里首先要讲到的就是图片拖拽上传了. oDiv.ondrop = function(e) { e.preventDefault(); //获取拖拽过来的对象,文件对象集合 var fs = e.dataTransfer.files; //若为表单域中的file标签

atitit. 文件上传带进度条 atiUP 设计 java c# php

atitit. 文件上传带进度条 atiUP 设计 java c# php 1. 设计要求 1 2. 原理and 架构 1 3. ui 2 4. spring mvc 2 5. springMVC.xml 3 6. struts extand url 3 7. behide code 3 8. 简化设计 3 1. 设计要求 带进度条 完成提示动画效果.. 2. 原理and 架构 如果需要显示进度条,实时显示文件上传进度 需要使用Ajaxj技术..up到个在的iframe黑头.. 工作原理 其实际

atitit.文件上传带进度条的实现原理and组件选型and最佳实践总结O7

1. 实现原理 1 2. 大的文件上传原理::使用applet 1 3. 新的bp 2 1. 性能提升---分割小文件上传,避免一次使用内存使用过大的 2 2. Uuid还是原来文件名称:: 2 3. 监听器频繁地被调用 2 4. 结合wz easyui 2 4. 选型 2 5. Uploadify::yash js+flash 3 6. commons-fileupload:: 3 7. COS这个工具O'Reilly公司 3 8. 大的文件上传组件总结 3 5. 林吧实现ui Ajax+jq

Struts2文件上传带进度条,虽然不是很完美

好久没有写东西,最近在做个项目,要用到文件h 传的,以前虽然也做上传,但是总觉得不好用 ,现在和队友合作做了一个带进度条的上传,觉得还行~~和大家分享一下. 首先说一下大概是这样实现的,在我们平时的上传表单里面,除了文件上传之外,也许还有其他的信息需要填写的,这样问题就来了:点击上传按钮之后,这个表单都封装并提交上去了,在上传完成后整个页面就跳转了.而且也不利于我们验证用户输入.很多人这样做的,把这2个操作分开,当然这样也行... 我们这样做:一个普通页面(可以用于填写所有信息的),一个文件上传

jQuery.uploadify-----文件上传带进度条,支持多文件上传的插件

借鉴别人总结的uploadify:基于jquery的文件上传插件,支持ajax无刷新上传,多个文件同时上传,上传进行进度显示,控制文件上传大小,删除已上传文件. uploadify有两个版本,一个用flash,一个是html5.html5的需要付费~所以这里只说flash版本的用法. uploadify官网地址:http://www.uploadify.com/ 上传文件截图: uploadify文档:http://www.uploadify.com/documentation/,在这儿可以查看

图片拖拽上传

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script src="html5/js/jquery-2.0.0.min.js"></script> </head> <body> <div name="image" id=&quo

html5 文件上传 带进度条

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <ti