轻量级 web 文件上传组件,支持html5,支持上传进度显示(IE10+、标准浏览器),文件拖拽,降级支持IE6+

老早就注册了博客园帐号,昨天才发现,连博客都没开,Github也是一样,深觉惭愧,赶紧潜个水压压惊`(*∩_∩*)′

言归正传。大概许多人都会用到文件上传的功能,上传的库貌似也不少,比如(jQuery File UploaderFineUploaderUploadifyBaidu Web Uploader 等等),功能都很强大,代码量一般也较大。当时心想,就这么个小功能,杀鸡焉用牛刀,用库的话还得熟悉它的用法,有的需要引入额外的库,纯Flash的不考虑,还是动手造个轮子得了,至少造过之后能知道底层的原理,关键是,自己写的东西,维护和修改方便,对过程可以进行全方位的控制。造个轮子简单,造个好用的轮子却就不是那么简单了。上传功能很快完成,但下次又用到的时候,却发现拿过来用需要修改不少东西,一是使用的JS库发生了变化,再就是UI界面完全不同,当时将上传逻辑和界面写的死死的,遇到不同的情况就需要针对性的改造。针对单一情况写的东西当然最轻量,只用考虑当前情况,不用的功能可以统统抛开,能做到最精简,但不方便重用。一个轮子如果不能重用,那当然不能算一个合格的轮子。意识到这点,而且既然已经走上了造轮子这条路,需要的核心功能也没有大的变化,那还是走下去吧。然后一路修修改改,最后完成了一个可用的版本。

原理

1. html5上传

这个需要浏览器支持,无论是html5上传还是和html4上传,html上传控件都是必不可少的,即:

<input type="file">
//监听 input 的 change 事件,获取要上传的数据
input.onchange = function () {
    //input.files 属性需要浏览器支持
    var files = this.files;

    for (var i = 0, len = files.length; i < len; i++) {
        var file = files[i];

        //file.name || file.fileName  => 文件名称
        //file.size || file.fileSize  => 文件大小

        upload_html5(file);
    }
};
//html5 上传
var xhr = new XMLHttpRequest();

//上传进度事件
xhr.upload.addEventListener("progress", function (e) { }, false);
//上传完成(成功)事件
xhr.addEventListener("load", function (e) {
    //获取服务器响应
    var text = e.target.responseText;
}, false);
//上传失败事件
xhr.addEventListener("error", function (e) { }, false);
//上传中断(取消)事件
xhr.addEventListener("abort", function (e) { }, false);

var fd = new FormData;
//添加要上传的文件对象
fd.append("file", file);

xhr.open("POST", "api/upload.ashx");
xhr.send(fd);

2. html4上传(传统上传)

通过将 form 的 target 指向 iframe 的 name 来实现无刷新上传

<iframe name="html4-upload-target"></iframe>
<form action="api/upload.ashx" method="post" enctype="multipart/form-data" target="html4-upload-target">
    <input type="file" name="upfile" />
</form>
//iframe load 事件
//注意:低版本 ie 支持 iframe 的 onload 事件,不过是隐形的(iframe.onload 方式绑定的将不会触发),需要通过 attachEvent 来注册
function bind_iframe_load(iframe, fn) {
    if (iframe.attachEvent) iframe.attachEvent("onload", fn);
    else iframe.addEventListener("load", fn, false);
}

//html4上传完成回调
bind_iframe_load(iframe, function () {
    //获取服务器响应
    var text = iframe.contentWindow.document.body.innerHTML;
});

美化

上传按钮很丑,我想美化咋整?IE10+及标准浏览器支持 input.click() 触发文件选择,有人说,低版本IE也能弹出这个框框呀,这里有个坑,弹是能弹,但是可能基于安全考虑无法获取文件数据,报拒绝访问。

既然必须点击上传控件来选取文件,那么可以通过绝对定位让上传控件遮盖上传按钮,然后将上传控件透明度设为0,以达到隐身的效果,如此一来表面点击的是上传按钮,实际点击的是上传控件,问题也就随之解决。

<!-- 上传按钮,样式随自己控制,假设宽高为分别为120px,36px,相对于body的边距分别为100px,100px -->
<a class="upload-target">选择文件上传</a>

<!-- 上传控件,选择文件后(change事件)将 input 追加到 form 即可 -->
<div style="width:120px;height:36px;position:absolute;left:100px;top:100px;overflow:hidden;filter: alpha(opacity=0);opacity:0;">
    <input type="file" name="upfile" style="width:120px;height:36px;font-size:100px;" />
</div>

关于html4上传,刚好看到一篇 利用iframe无刷新上传文件的坑 文章,有兴趣的童鞋可以看看。

关于我的上传控件

当当当当,广告时间到……

特点:

  • 轻量级,不依赖任何JS库,核心代码(Q.Uploader.js)仅约700行,min版本加起来不到12KB
  • 纯JS代码,无需Flash,无需更改后台代码即可实现带进度条(IE10+、其它标准浏览器)的上传,其它(eg:IE6+)自动降级为传统方式上传
  • 上传核心与UI界面分离,可以很方便的定制上传界面包括上传按钮
  • 上传文件的同时可以指定上传参数,支持上传类型过滤
  • 完善的事件回调,可针对上传的每个过程进行单独处理
  • 方便的UI接口,上传界面可以随心所欲的定制

话说有图有真相 O(∩_∩)O

简单调用示例(暴露的全局对象为Q):

var uploader = new Q.Uploader({
    url: "api/upload.ashx?type=file",
    target: document.getElementById("upload-target"),
    view: document.getElementById("upload-view"),

    //html5: true,       //是否启用html5上传,默认为true
    //multiple: true,    //是否允许多选(仅html5模式有效),默认为true
    //auto: true,        //添加任务后是否立即上传,默认为true

    //允许或不允许上传的文件类型 (allows 与 disallows 可单一或组合使用)
    //allows: ".txt,.jpg,.png,.gif,.zip,.rar,.7z",
    //disallows:".exe"

    //每次上传都会发送的参数(POST方式)
    data: { user: "Devin" }
});

详细见示例代码或 Github(感觉逼格瞬间提升了有木有,*^_^* )

https://github.com/devin87/web-uploader

代码下载

asp.net 或其它后台示例代码

Node.js 示例代码

说在最后

如果本文或本项目对您有帮助,请不吝点个赞。如果有什么意见或建议,欢迎交流!

时间: 2024-11-23 22:14:41

轻量级 web 文件上传组件,支持html5,支持上传进度显示(IE10+、标准浏览器),文件拖拽,降级支持IE6+的相关文章

elementUI上传组件改造--扫码上传

1.需求 接到客户方的需求:web端如果要上传图片,通常得, 1.手机拍照 2.拷贝到电脑 3.电脑再点击上传(手机的安全性,不熟悉的话,十分麻烦) 客户需要直接在手机上直接上传到系统,十分合理,非常有价值的功能 2.分析 1.跨终端(打通pc和移动端的壁垒) 2.不影响原有功能(不改动原来代码,否则,可能会导致业务逻辑改变,会需要测试同事重新测试,需避免) 3.手机上传后,怎么pc端如何监听,并做反馈操作(主动触发即可) 3.实现 1.跨终端 依照现有的JWT,可以通过url携带token的方

单独调用kindeditor的多图上传组件实现多图上传

本例是单独调用kindeditor多图上传的组件来进行多图上传,兼容性你懂得! 官方示例地址:http://kindeditor.net/ke4/examples/multi-image-dialog.html Html JS

HTML5开发 拖拽文件上传

Drag&Drop 拖拽功能的处理 关于HTML5拖拽文件上传,其实国外已经有很多网站有这样的应用,最早推出拖拽上传应用的是 Gmail,它支持标准浏览器下拖拽本地文件到浏览器中作为邮件的附件发送,但其实现在利用HTML5的功能实现,主要借助于新版支持的浏览器来实现,IE还是弱很多. 拖拽上传应用主要使用了以下 HTML5技术: Drag&Drop : HTML5基于拖拽的事件机制.File API : 可以很方便的让 Web 应用访问文件对象,File API 包括FileList.Bl

HTML5文件上传组件美化jQuery插件

简要教程 jQuery.filer是一款简单的HTML5文件上传组件美化jQuery插件.它能够完成单文件和多文件的上传,支持文件的拖拽,支持不同的文件格式校验,支持缩略图和图标等,是一款非常实用的文件上传插件.它的特点还有: 对文件上传File Input组件进行美化 支持多文件上传 支持校验文件:大小,扩展名等 支持创建文件的缩略图 每种类型的文件可以自定义图标 可以为缩略图,图标和input自定义模板和主题 可以移出已选择的文件 可以从剪切板粘贴图片 所有的图标在一个字体文件中 支持文件拖

Web Uploader - 功能齐全,完美兼容 IE 的上传组件

文件上传是网站和 Web 应用程序的常用功能,一直没有一款完美的文件上传组件,因此让很多开发人员碰到头疼的浏览器兼容问题. WebUploader 是由 Baidu FEX 团队开发的一款以 HTML5 为主,FLASH 为辅的现代文件上传组件.在现代的浏览器里面能充分发挥 HTML5 的优势,同时又不摒弃主流IE浏览器,沿用原来的 FLASH 运行时,兼容 IE6+,iOS 6+, android 4+.采用大文件分片并发上传,极大的提高了文件上传效率. 源码下载      在线演示 特性 分

原生API实现拖拽上传文件实践

功能: 拖拽上传文件.图片,上传的进度条,能够同时上传多个文件. 完整的demo地址:https://github.com/qcer/FE-Components/tree/master/QDrag 涉及到的API: 1.HTML5的拖拽事件:dragenter,dragover,drop等 2.XMLHttpRequest  Level2 3.FormData 4.(扩展:HTML5的File API) 概述: 1.利用拖拽实践的API将一个普通的div自定义成一个放置目标,这里有一个技巧是放置

使用ivx实现拖拽上传文件功能的经验总结

在实际案例中经常会使用到上传文件的功能,不过普通的上传文件需要用户再去一层一层查找文件的路径并不是十分的方便,今天给大家讲一种使用拖拽放置容器实现上传文件的方法.1.拖拽放置容器拖拽放置容器位于拓展组件中的特殊功能容器类,我们可以给它添加事件拖拽放置,此事件的动作中我们能获取一个返回值--拖拽文件,在调试记录中打印出来可以看到里面包含文件的名称.大小和类型等信息.不过拖拽放置容器只是把文件拖拽进来,上传到服务器还是要使用文件接口组件.文件接口上传文件动作的回调中会收到文件上传到服务器后的一些信息

web前端开发常用组件

1. 对话框(dialog):jbox(适合对话框等其它功能).colorbox(也很强大,可以弥补jbox图片轮播的落点),      这二者基本能搞定所有对话框的情况 2. 文件上传:plupload(适合多.大文件分块上传,另外对兼容性要求很强的地方首选,      这个兼容性做的很好,只是界面在有些地方不合适).Uploadify(功能也可以,      适合轻量简约风格的地方使用,曾经在kppw封装的不错),jQuery File Upload(这个的界面也很大气,      而且有图

HTML5 02. 多媒体控件、拖拽事件、历史记录、web存储、应用程序缓存、地理定位、网络状态

多媒体 video:是行内块(text-align: center; 对行内块适用) <figure></figure>: 多媒体标签 : <figcaption></figcaption>: 多媒体标题 方法: load() 加载.play()播放.pause()暂停 属性: currentTime 视频播放的当前进度. duration:视频的总时间. paused:视频播放的状态 事件:   oncanplay:事件在用户可以开始播放视频/音频(aud

高仿富途牛牛-组件化(一)-支持页签拖拽、增删、小工具

目录 一.概述 二.效果展示 三.实现方案分析 1.第一阶段 2.第二阶段 3.第三阶段 一.概述 好久没有做业务相关的UI功能了,比较炫酷的交互效果也写的少了,最近花了2天时间写了一个简易的高仿富途牛牛组件化的功能,当然了这只是一个初步的效果,而且没有做贴图.美化等工作,但是基本的功能已经有了.本篇文章只是作为组件化的一个开始,后续还会陆续引入更多关于组件化的介绍,相信功能也会越来越丰富.除此之外,富途牛牛的一些其他高级功能也会陆续引入,不乏有k线.分时.五日.指标.自选这样的复杂功能. 自选