jquery上传插件 -- dropzone、plupload、uploadify作对比

在项目中需要用到上传文件的插件先后都使用过这三个上传插件;

现在对这3个插件进行个人分析与建议供大家参考;

dropzone

下载地址:https://github.com/enyo/dropzone/ 

特点:1.兼容Firefox、chrome、Safari、IE10(低版本则采用传统的input file)

           2.可以一次上传多个文件,可点击可拖动;


第一步:浏览器兼容性
     
     
  1. //兼容form表单集合图片提交的写法
  2. <form action=''>
  3. <div id="file" class="dropzone" > //改成使用DIV调用插件不是用form调用;
  4. <div class="dropzone-previews"></div>
  5. </div>
  6. </form>

在IE8-IE9、Safari中无法兼容dropzone插件,所以会自动生成, 如果纯上传图片是木有影响,但是要加入表单验证就会变成form内嵌套form:
     
     
  1. <form action=''>
  2. <form action=''> //目的把这个form去掉;
  3. <input type='file' />
  4. <input type='submit' value='aubmit'>
  5. </form>
  6. <input type='submit' value='submit name='submit''
  7. </form>
首先要先去掉自动生成的submit按钮;
 解决:利用jQuery(document).ready(function($) {} 判断自动生成的元素中是否含有 <input type='submit' value='aubmit'>,有则代表是不兼容该插件的,然后去掉该submit按钮;

然后 去掉自动生成的form标签;
利用jQuery的   unwrap( );

第二步:在兼容的浏览器加验证
通过上面的修改form表单已经正常;
验证像input type='text'那种较为简单,而是如何让插件只有当条件满足才执行插件(方法如下代码);
      
      
  1. <script>
  2. Dropzone.autoDiscover = false; // 禁止对所有元素的自动查找;
  3. var dropz = new Dropzone("#file",{ //这样设置后,然后在满足条件的写成这样既能调用 dropz.processQueue();
  4. url: "upload-file.php",
  5. autoProcessQueue: false,
  6. uploadMultiple: true,
  7. parallelUploads: 100, //并行上传文件数量
  8. maxFiles: 1,
  9. addRemoveLinks:true,
  10. maxFilesize: 200, //单位MB
  11. acceptedFiles:'.mov , .mp4'
  12. init: function() { //document初始化时调用的事件;
  13. var myDropzone = this;
  14. this.on("addedfile", function () {
  15. });
  16. this.on("removedfile", function () {
  17. });
  18. this.on("complete", function(file) {
  19. });
  20. }
  21. });
  22. </script>
再到每个浏览器间如何判断上传文件是否为空:
一、IE7 - IE9 :通过标签input  type='file' 的value 是否为空来判断;利用原生获取document.getElementById("fileNum").value.length;  fileNum为文件标签ID值
二、Safari :通过document.getElementById('fileNum').files==0  判断;
三、Firefox、chrome通过jQuery判断框内是否含有某个class类来判断;
注意:想要获取Safari文件个数只能通过JS,但是file标签没有ID属性,所以通过jQuery后添加再用JS选择到该file标签;
第三步:数据载入数据库:分为 图片上传URL 与 数据的插入;
一、由于插件只能纯上传图片,无法上传数据,所以单独一个php文件插入数据(包括插入图片url);
二、低版本上传图片无法判断图片类型与文件名,要使用前端split()截取,后台截取前貌似没有“\”,无法判断文件名与类型;



plupload

参考地址:http://www.phpin.net/tools/plupload/

特点:1.兼容Firefox、chrome、Safari、IE6(低版本则采用传统的swf)

           2.主要特点不采用form表单直接使用,可以一次上传多个文件,可点击可拖动;

缺陷:点击上传按钮延迟弹出选择框。不友好;

使用方式:

Html:

<div id="container">

        <a id="uploadify" class="fileName ">请选择上传文本</a>

        <input type="button" class="btn_upload" value="上传" />

        <label class="filetTie" style="float:none;" title='展示错误信息'></label>

</div>

JavaScript

   
   
  1. var uploader = new plupload.Uploader({
  2. runtimes : 'gears,html5,flash,silverlight,browserplus', //官网上默认是gears,html5,flash,silverlight,browserplus
  3. browse_button : 'uploadify',
  4. container: 'container',
  5. url : 'upload-textfile.php' ,
  6. multi_selection: false,
  7. flash_swf_url : 'http://localhost/basic_boostarp_video_website/js/plupload/Moxie.swf', //兼容低版本上传文件选择框
  8. silverlight_xap_url:'http://localhost/basic_boostarp_video_website/js/plupload/Moxie.xap', //兼容低版本上传文件选择框
  9. filters : {
  10. mime_types: [
  11. {title : "Image files", extensions : "txt,xls,xlsx,doc,docx,ppt,pptx,pdf,"},
  12. {title : "Zip files", extensions : "zip"}
  13. ]
  14. },
  15. max_file_size : '2mb', //最大只能上传400kb的文件(格式100b, 10kb, 10mb, 1gb)
  16. prevent_duplicates : true, //不允许选取重复文件
  17. init: {
  18. PostInit:function(uploader){
  19. $(".btn_upload").on("click",function(){
  20. if($(".text_file").length>0){
  21. $(".filetTie").text("");
  22. uploader.start();
  23. }else{
  24. $(".filetTie").text("请选择文件");
  25. return false;
  26. }
  27. })
  28. },
  29. FilesAdded:function(uploader,files){
  30. var p='';
  31. $(".filetTie").text(""); //把下面错误信息在文件加入时就清空;
  32. if($(".text_file>p").length>0){
  33. swal({
  34. title: "ERROR",
  35. text: "只能上传一个文件",
  36. type: "error",
  37. confirmButtonColor: "#b3b3b3",
  38. });
  39. }else{
  40. plupload.each(files, function(file){ //遍历所有上传到列表内的文件;
  41. p += "<div class='text_file'><input type='hidden' name='uploadify_hideText' class='uploadify_hideText' value='"+file['name']+"'><p id='" + file['id'] + "'>"+file['name']+"("+plupload.formatSize(file['size'])+")"+"<span class='btn_delete' btnid='"+ file['id'] +"'>DELETE</span></p><div class='progress' style='display:none;'><span class='bar'></span><span class='percent'>上传中 0%</span></div></div>";
  42. })
  43. $("#container > div.col-md-3").append(p);
  44. btnDelete(uploader); //异步获取的再加载删除函数;
  45. }
  46. },
  47. UploadProgress:function(uploader,file){
  48. $(".progress").css('display', 'block');
  49. var percent = file.percent;
  50. $("#" + file.id).next(".progress").children('.bar').css({"width": percent + "%"});
  51. $("#" + file.id).next(".progress").children('.percent').text("上传"+percent + "%");
  52. },
  53. Error:function(uploader,errObject){
  54. if(errObject.code==-601){
  55. $(".filetTie").text("请上传文档类型(txt、doc、xls、pdf)");
  56. return false;
  57. }else if(errObject.code==-600){
  58. $(".filetTie").text("请上传小于2MB的文档");
  59. return false;
  60. }
  61. }
  62. }
  63. });
  64. uploader.init(); //必加设置,插件初始化;
  65. function btnDelete(obj){
  66. $(".btn_delete").on("click",function(){
  67. $(this).parents(".text_file").remove();
  68. var toremove = '';
  69. var btnid = $(this).attr("btnid");
  70. for(var i in obj.files){ //这里是实际把对象文件删除的;i(表示索引)获得files中对应的file
  71. if(obj.files[i].id === btnid){
  72. toremove = i;
  73. obj.files.splice(toremove, 1); //splice(添加/删除项目的位置,删除的项目数量);
  74. }
  75. }
  76. })
  77. }


uploadify

参考地址:http://www.cnblogs.com/yangy608/p/3915349.html 

特点:1.兼容Firefox、chrome、Safari、IE6(低版本则采用传统的swf)

           2.主要特点不采用form表单直接使用,上传完毕展示图片,可以一次上传多个文件,可点击可拖动;

引用文件:
HTML:
   
   
  1. <input type="file" name="uploadify" id="uploadify" />
  2. <div class="btn-group">
  3. <a class="btn btn-xs btn-default upload-start disabled" href="javascript:$('#uploadify').uploadify('upload','*')">开始上传
  4. <a class="btn btn-xs btn-default upload-clear disabled" href="javascript:$('#uploadify').uploadify('cancel', '*')">清空队列</a>
  5. </div>
  6. <div id="imgList">
  7. <ul></ul>
  8. </div>

JS:
   
   
  1. <?php $timestamp = time(); ?> //获取当前时间戳通过插件传给后端做判断
  2. $("#uploadify").uploadify({
  3. //插件是用swf方式上传文件
  4. 'swf': 'js/plugins/uploadify/uploadify.swf',
  5. //后台处理的页面
  6. 'uploader': 'js/plugins/uploadify/uploadify.php',
  7. 'buttonClass': 'btn btn-xs btn-primary',
  8. //按钮显示的文字
  9. 'buttonText': '广告信息',
  10. //显示的高度和宽度,默认 height 30;width 120
  11. 'height': 30,
  12. 'width': 80,
  13. //上传文件的类型 默认为所有文件 'All Files' ; '*.*'
  14. //在浏览窗口底部的文件类型下拉菜单中显示的文本
  15. 'fileTypeDesc': 'Image Files',
  16. //允许上传的文件后缀
  17. 'fileTypeExts': '*.gif; *.jpg; *.png',
  18. //上传文件页面中,你想要用来作为文件队列的元素的id, 默认为false 自动生成, 不带#
  19. //'queueID': 'fileQueue',
  20. //选择文件后自动上传
  21. 'auto': false,
  22. //设置为true将允许多文件上传
  23. 'multi': false,
  24. //发送给后台的其他参数通过formData指定
  25. //'formData': { 'someKey': 'someValue', 'someOtherKey': 1 },
  26. 'formData' : {
  27. 'timestamp' : '<?php echo $timestamp; ?>', //定义当前时间戳为参数传给后端
  28. 'token' : '<?php echo md5('unique_salt' . $timestamp); ?>'
  29. },
  30. 'onSelect' : function(file){ //当每次选中文件后触发
  31. $("#upfileMessage").text("");
  32. if(file.name) $('.upload-start , .upload-clear').removeClass('disabled');
  33. },
  34. 'onSelectError' : function(file, errorCode, errorMsg){ //当每次选择错误文件后触发
  35. $("#upfileMessage").text(file + errorMsg)
  36. },
  37. 'onQueueComplete' : function(queueData){ //当所有文件上传完毕后触发展示状态数据
  38. //console.log(queueData)
  39. },
  40. 'onUploadSuccess':function(file,data,response){ //每个文件上传成功后触发
  41. //该插件是一个接着一个上传,所以实现多缩略图展示只需要在规定的位置后面插入即可;
  42. var obj = JSON.parse(data); //转为JSON格式
  43. var $ul = $("#imgList ul");
  44. var $img = $("#imgList ul > li > img");
  45. $ul.append('<li><img src="uploads/' + obj.name + '" class="img-thumbnail" /></li>'); //文件上传完成显示缩略图
  46. if(obj.status){
  47. //console.log('load success');
  48. $ul.children('li').append('<span class="uploadSuccess"><i class="fa fa-check-circle"></i></span>');
  49. }
  50. }
  51. });
PHP
uploadify.php
   
   
  1. <?php
  2. //设置存放文件的目录
  3. $targetFolder = '/uploads';
  4. $fileName = $_FILES['Filedata']['name'];
  5. $verifyToken = md5('unique_salt' . $_POST['timestamp']);
  6. //通过从前端获取的时间戳判断当前文件是否超时再往下执行
  7. if (!empty($_FILES) && $_POST['token'] == $verifyToken) {
  8. $tempFile = $_FILES['Filedata']['tmp_name'];
  9. $targetPath = $_SERVER['DOCUMENT_ROOT'] . $targetFolder;
  10. $targetFile = rtrim($targetPath,'/') . '/' . $_FILES['Filedata']['name'];
  11. // Validate the file type
  12. $fileTypes = array('jpg','jpeg','gif','png');
  13. $fileParts = pathinfo($_FILES['Filedata']['name']);
  14. //判断是否符合上传类型/格式/大小
  15. if (in_array($fileParts['extension'],$fileTypes)) {
  16. move_uploaded_file($tempFile,$targetFile);
  17. $data=array('status' => 1 ,'name' => $fileName);
  18. echo json_encode($data,JSON_UNESCAPED_UNICODE);
  19. } else {
  20. echo 'Invalid file type.';
  21. }
  22. }
  23. ?>


以上三个插件的code基本拥有上传文件类型限制,大小限制、上传交互、进度条等常用效果;

第一个插件Dropzone更适合图片上传,而文件可能不太适合。因为对于结合form使用比较繁琐;

第二个插件plupload兼容性不错,也挺方便,但是有个比较严重用户体验问题,就是点击上传文件按钮响应稍慢且上传完成后的图片不能展示;

本人建议使用第三个插件uploadify,从兼容性,独立性,轻量级,上传类型都比较适合。而且完成后可以显示图片;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值