因为有万恶的IE存在,所以当Web项目初始化并进入开发阶段时。

如果是项目经理,需要知道客户将会用什么浏览器来访问系统。

明确知道限定浏览器的情况下,你才能从容的让手下的封装必要的前端组件。

本篇文章试图从常见的上传方式和组件进行分析,仅局限与前端,至于后端需依据业务复杂度,自行拿捏实现方式,若文中有纰漏,欢迎拍砖!

1. Input type="file" 也可以性感

当然你也可以不用任何成熟的上传组件,表单提交文件,像这样:

<form action="<%=request.getContextPath()%>/uploadfile" method="POST" enctype="multipart/form-data">
yourfile: <input type="file" name="myfiles"/><br/>
<input type="submit"/>
</form>

多个文件一起提交,添加里面的 input 选项即可,但 name 名称需要一致。

当然你也可以在提交文件的时候,提交一些其他的参数数据上去,像下面这样:

<form action="<%=request.getContextPath()%>/uploadfile" method="POST" enctype="multipart/form-data">
username: <input type="text" name="username"/><br/>
password: <input type="password" name="password"/><br/>
yourfile: <input type="file" name="myfiles"/><br/>
yourfile: <input type="file" name="myfiles"/><br/>
yourfile: <input type="file" name="myfiles"/><br/>
<input type="submit"/>
</form>

注意其中的 enctype 设置为multipart/form-data。

这种上传文件的方式,优缺点显而易见,不需要使用任何第三方 js,纯天然 html 标签、走到哪用到哪、没有浏览器障碍.....

对于多变的项目需求,比如这些特性:实时上传的进度条、能拖拽文件上传、上传前压缩、MD5加密验证等.....

你需要耐着性子自己实现,有造好的轮子,你为什么不用呢?

所以说这种性感撩人的 <input type="file">  的标签能出现的项目,定位在小型简单、客户好说话的web应用中。

2. Uploadify 双版本上传组件

这个组件想必是用的比较广泛,提供 Flash 和 HTML5 两个不同的版本,能让你避免很多浏览器兼容性的问题。

支持显示文件上传实时进度条,拖拽文件上传、多样化的参数配置、高度可定制化....能满足绝大部分项目的上传需求。

官网地址:http://www.uploadify.com/

其中 Flash 版是免费下载的,但 HTML5 版本需要掏钱,如果你需要H5  Version,请在评论区留邮箱。

使用这个组件的前提,需要先引入 Jquery:

<script type="text/javascript" src="/style/js/jquery.js"></script>
<script type="text/javascript" src="/style/js/jquery.uploadify.min.js"></script>
<style type="text/css" src="/style/js/uploadify.css"></style> <div class="updiv">
<div class="upfileAfter">
<a href="javascript:$('#upfileBtn').uploadify('upload','*')">开始上传</a>
</div>
<a href="#" id="upfileBtn">选择文件</a>
</div>

初始化组件方法(具体的参数设置和回调函数的入参请查阅官方文档):

$("#upfileBtn").uploadify({
'debug': false,// 开启调试
'auto': false,// 是否自动上传
//'simUploadLimit' : 3, //并发上传数量[falsh版不生效]
//'successTimeout': 30,// 默认值30秒,文件上传完成时等待服务器响应的时间,之后显示成功信息。
'fileObjName' : 'file',
'swf': XX+ "/style/js/uploadifynochange/uploadify.swf",
'uploader': XX + '/service/uploadFile',// 上传处理程序
'formData': {'fjzlDm': '', timeStamp: ''},
'multi': true,// 是否支持多文件上传
'width': '95px',// 浏览按钮的宽度
'height': '30px',// 浏览按钮的高度
'progressData' : 'speed', //文件进度条的样式
'buttonText': '<i class="icon icon-file icon-white"></i> 选择文件', //按钮文字
'fileSizeLimit': '10240',//上传文件大小限制
'fileTypeExts': '*.bmp;*.png;*.jpeg;*.jpg;*.gif',//可上传的文件类型
'overrideEvents': ['onDialogClose','onUploadSuccess','onUploadError'],
'onFallback': function () {
alert("您未安装FLASH控件,无法上传图片!请安装FLASH控件后再试。");// 检测FLASH失败调用
},
'onDialogClose': function () {
alert("Dialog Close......");
},
'onUploadSuccess': function (file, data, response) {
alert("UploadSuccess......");
},
'onUploadError' : function () {
alert("Upload Error......");
}
});

网上有很多上传组件都是修改 Uploadify 的源码的某一部分,然后重新命名的。

这个组件在项目中表现确实不错,使用 Flash version 浏览器中只需要安装 Flash Player 即可。

当下浏览器中不安装 Flash Player 的确找不出几个。

但不置可否的是 Flash 效率 没有 H5 的高,兼容性和稳定性必须舍弃一部分,让两者都有相对最优解。

3. Web Uploader 百度技术团队开源力作

Webuploader 是由百度 Fex-team 团队开发,官网地址:http://fex.baidu.com/webuploader/

除了 Uploadify 的所有特性,最吸引人的特点是文件可以分片并发上传、同一组件内部决定使用 Flash 还是 H5 上传....

最后出场的一般都是压轴人物,不否认的是现在我们中项目中使用的就是 Web Uploader 组件。

不在为浏览器的兼容性而频繁更换组件调整代码,Uploader 会根据运行环境切换上传的方式,让你更省心。

<script type="text/javascript" src="/style/js/jquery.js"></script>
<script type="text/javascript" src="/style/js/webuploader.min.js"></script>
<style type="text/css" src="/style/js/webuploader.css"></style> <div id="uploader" class="wu-example">
<div id="thelist" class="uploader-list"></div>
<div class="btns" style="position: relative;display: inline-block">
<div id="picker"><i class="glyphicon glyphicon-plus"></i>点击添加文件</div>
<a href="#" id="up-all">开始上传</a>
</div>
</div>

初始化组件方法(具体的参数设置和回调函数的入参请查阅官方文档):

var uploader = WebUploader.create({
// swf文件路径
swf: '/style/js/webuploade/Uploader.swf',
// 文件接收服务端。
server: '/service/uploadFile',
auto: false,
formData: {
paramA: 'paramA'
},
// 选择文件的按钮。可选。
// 内部根据当前运行是创建,可能是input元素,也可能是flash.
pick: '#picker'
}); $("#up-all").on("click",function(){
uploader.upload();
});
// 当有文件被添加进队列的时候
uploader.on('fileQueued', function (file) {
$("#thelist").append('<div id="' + file.id + '" class="item">' +
'<h4 class="info">' + file.name + '</h4>' +
'<p class="state">等待上传...</p>' +
'</div>');
}); // 文件上传过程中创建进度条实时显示
uploader.on('uploadProgress', function (file, percentage) {
var $li = $('#' + file.id),
$percent = $li.find('.progress .progress-bar'); // 避免重复创建
if (!$percent.length) {
$percent = $('<div class="progress progress-striped active">' +
'<div class="progress-bar" role="progressbar" style="width: 0%">' +
'</div>' +
'</div>').appendTo($li).find('.progress-bar');
} $li.find('p.state').text('上传中');
$percent.css('width', percentage * 100 + '%');
}); uploader.on('uploadError', function (file) {
$('#' + file.id).find('p.state').text('上传出错');
}); uploader.on('uploadComplete', function (file) {
$('#' + file.id).find('.progress').fadeOut();
}); uploader.on('startUpload', function () {
uploader.option('formData', {'paramA': ''});
});

Uploadify 和 Uploader 都可以动态的添加表单参数。

个人偏向于喜欢百度的这款 Uploader,但仁者见仁智者见智,多几种选择未尝不是好事情。

还需要注意的是,在实现获取上传文件的过程中,我发现只有表单提交上去的多文件是在一次请求当中。

而 Uploadify 和 Uploader 都是点击全部上传后,多次请求后端的 Action,每次只携带一个文件。

请求次数等于你的文件上传次数,我在实现过程中是通过添加时间戳的方式解决的该问题。

也有可能是我使用的有问题,文件上传后肯定需要和具体的业务挂钩,业务问题这里就不赘述了。

web 前端常用组件【06】Upload 控件的更多相关文章

  1. web 前端常用组件【05】ZTree

    web 项目或多或少都会有涉及到什么人员职称树,菜单树,组织机构树等. 历手三四个项目有大有小,采用的树前端都是 Ztree. 有些优秀的J2EE 框架将这些常用的组件都封装起来,作为模块化的组件提供 ...

  2. web 前端常用组件【04】Datetimepicker 和 Lodop

    web项目中日期选择器和打印这两个功能是非常常见,将使用过的日期和打印控件,在这里总结归纳,为方便后面使用. 1.Datetimepicker a.官方API:http://www.bootcss.c ...

  3. web 前端常用组件【01】Pagination 分页

    分页组件几乎是一般网站都会涉及到的组件,网上有很多这样的插件,自己挑来跳去选择了这一款. 官方Demo网址:http://mricle.com/JqueryPagination 功能强大,可扩展性比较 ...

  4. web 前端常用组件【07】弹出层 Layer

    web 项目中总是需要弹出框,来让用户进行下一步的操作. 大到弹出另外一个页面,小到弹出提示.确认等. 经手几个项目,还是感觉 Layer 用起来比较的轻松,你能想到的 Layer 都能帮你做到. 感 ...

  5. web 前端常用组件【03】Bootstrap Multiselect

    实际的项目网站中或多或少的或用到多选框,我选用的一款是 Bootstrap Multiselect. 官方文档:http://www.kuitao8.com/demo/20140224/1/boots ...

  6. web 前端常用组件【02】Select 下拉框

    <select id="hello"></select>   关于 select 支持的属性和响应事件,可以参照:http://www.runoob.com ...

  7. 整理部分JS 控件 WEB前端常用的做成Jsp项目,方便今后直接用

    整理部分JS 控件  WEB前端常用的做成Jsp项目,方便今后直接用 最近又没时间了,等用时间了,再加入更多的, 源码下载: http://download.csdn.net/detail/liang ...

  8. 基于CkEditor实现.net在线开发之路(3)常用From表单控件介绍与说明

    上一章已经简单介绍了CKEditor控件可以编写C#代码,然后可以通过ajax去调用,但是要在网页上面编写所有C#后台逻辑,肯定痛苦死了,不说实现复杂的逻辑,就算实现一个简单增删改查,都会让人头痛欲裂 ...

  9. 基于MVC4+EasyUI的Web开发框架形成之旅--界面控件的使用

    在前面介绍了两篇关于我的基于MVC4+EasyUI技术的Web开发框架的随笔,本篇继续介绍其中界面部分的一些使用知识,包括控件的赋值.取值.清空,以及相关的使用. 我们知道,一般Web界面包括的界面控 ...

随机推荐

  1. director.js:客户端的路由---简明中文教程

    1.引子 最近学用director.js,那是相当的简单易学易使用.不过开始学的时候,搜搜过后,却没有发现相关的中文教程.于是决定硬啃E文,翻译备用的同时也当是给自己上课并加深对它的理解. direc ...

  2. OS的沙盒机制 --基础知识

    /* iOS的沙盒机制,应用只能访问自己应用目录下的文件. iOS不像android,没有SD卡概念,不能直接访问图像.视频等内容. iOS应用产生的内容,如图像.文件.缓存内容等都必须存储在自己的沙 ...

  3. 从汇编角度分析C语言的过程调用

    ➠更多技术干货请戳:听云博客 基本术语定义 1.系统栈(system stack)是一个内存区,位于进程地址空间的末端. 2.在将数据压栈时,栈是自顶向下增长的,该内存区用于函数的局部变量提供内存.它 ...

  4. iOS流行的开源代码库

    本文介绍一些流行的iOS的开源代码库 1.AFNetworking 更新频率高的轻量级的第三方网络库,基于NSURL和NSOperation,支持iOS和OSX.https://github.com/ ...

  5. 关于OC中的小数精确计算---NSDecimalNumber

    NSDecimalNumber 翻译补充自:http://rypress.com/tutorials/objective-c/data-types/nsdecimalnumber 感谢乐于分享的大神 ...

  6. Java和WebSocket开发网页聊天室

    小编心语:咳咳咳,今天又是聊天室,到现在为止小编已经分享了不下两个了,这一次跟之前的又不大相同,这一次是网页聊天室,具体怎么着,还请各位看官往下看~ Java和WebSocket开发网页聊天室 一.项 ...

  7. css解决方案

    1,Flexbox(更优雅的布局) ①居中:{display:flex; justify-content:center; align-items:center;}②设定flex-grow属性的话,会自 ...

  8. 【转】Jsduck一个纯净的前端文档生成神器

    让前端程序更具可维护性,是一个老生常谈的问题,大多数时候我们都关注于应用层面的代码可维护性,如:OO.模块化.MVC,编码规范.可扩展和复用性,但这都是属于设计层面需要考虑的事情,可维护性还应包含另一 ...

  9. ADO.NET五大对象理论和实践(草稿)

    一.ADO.NET五大对象理论 1. Connection:与数据源建立连接. 2. Command:对数据源执行SQL命令并返回结果. Command对象在执行的的时候有几个比较重要的方法,如Exe ...

  10. [转载]java之yield(),sleep(),wait()区别详解

    原文地址:http://dylanxu.iteye.com/blog/1322066 1.sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁 ...