diyUpload.js 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. /*
  2. * jQuery文件上传插件,封装UI,上传处理操作采用Baidu WebUploader;
  3. * @Author 黑爪爪;
  4. */
  5. (function( $ ) {
  6. $.fn.extend({
  7. /*
  8. * 上传方法 opt为参数配置;
  9. * serverCallBack回调函数 每个文件上传至服务端后,服务端返回参数,无论成功失败都会调用 参数为服务器返回信息;
  10. */
  11. diyUpload:function( opt, serverCallBack ) {
  12. if ( typeof opt != "object" ) {
  13. alert('参数错误!');
  14. return;
  15. }
  16. var $fileInput = $(this);
  17. var $fileInputId = $fileInput.attr('id');
  18. //组装参数;
  19. if( opt.url ) {
  20. opt.server = opt.url;
  21. delete opt.url;
  22. }
  23. if( opt.success ) {
  24. var successCallBack = opt.success;
  25. delete opt.success;
  26. }
  27. if( opt.error ) {
  28. var errorCallBack = opt.error;
  29. delete opt.error;
  30. }
  31. //迭代出默认配置
  32. $.each( getOption( '#'+$fileInputId ),function( key, value ){
  33. opt[ key ] = opt[ key ] || value;
  34. });
  35. if ( opt.buttonText ) {
  36. opt['pick']['label'] = opt.buttonText;
  37. delete opt.buttonText;
  38. }
  39. var webUploader = getUploader( opt );
  40. if ( !WebUploader.Uploader.support() ) {
  41. alert( ' 上传组件不支持您的浏览器!');
  42. return false;
  43. }
  44. //绑定文件加入队列事件;
  45. webUploader.on('fileQueued', function( file ) {
  46. createBox( $fileInput, file ,webUploader);
  47. });
  48. //进度条事件
  49. webUploader.on('uploadProgress',function( file, percentage ){
  50. var $fileBox = $('#fileBox_'+file.id);
  51. var $diyBar = $fileBox.find('.diyBar');
  52. $diyBar.show();
  53. percentage = percentage*100;
  54. showDiyProgress( percentage.toFixed(2), $diyBar);
  55. });
  56. //全部上传结束后触发;
  57. webUploader.on('uploadFinished', function(){
  58. $fileInput.next('.parentFileBox').children('.diyButton').remove();
  59. });
  60. //绑定发送至服务端返回后触发事件;
  61. webUploader.on('uploadAccept', function( object ,data ){
  62. if ( serverCallBack ) serverCallBack( data );
  63. });
  64. //上传成功后触发事件;
  65. webUploader.on('uploadSuccess',function( file, response ){
  66. var $fileBox = $('#fileBox_'+file.id);
  67. var $diyBar = $fileBox.find('.diyBar');
  68. $fileBox.removeClass('diyUploadHover');
  69. $diyBar.fadeOut( 1000 ,function(){
  70. $fileBox.children('.diySuccess').show();
  71. });
  72. if ( successCallBack ) {
  73. successCallBack( response );
  74. }
  75. });
  76. //上传失败后触发事件;
  77. webUploader.on('uploadError',function( file, reason ){
  78. var $fileBox = $('#fileBox_'+file.id);
  79. var $diyBar = $fileBox.find('.diyBar');
  80. showDiyProgress( 0, $diyBar , '上传失败!' );
  81. var err = '上传失败! 文件:'+file.name+' 错误码:'+reason;
  82. if ( errorCallBack ) {
  83. errorCallBack( err );
  84. }
  85. });
  86. //选择文件错误触发事件;
  87. webUploader.on('error', function( code ) {
  88. var text = '';
  89. switch( code ) {
  90. case 'F_DUPLICATE' : text = '该文件已经被选择了!' ;
  91. break;
  92. case 'Q_EXCEED_NUM_LIMIT' : text = '上传文件数量超过限制!' ;
  93. break;
  94. case 'F_EXCEED_SIZE' : text = '文件大小超过限制!';
  95. break;
  96. case 'Q_EXCEED_SIZE_LIMIT' : text = '所有文件总大小超过限制!';
  97. break;
  98. case 'Q_TYPE_DENIED' : text = '文件类型不正确或者是空文件!';
  99. break;
  100. default : text = '未知错误!';
  101. break;
  102. }
  103. alert( text );
  104. });
  105. }
  106. });
  107. //Web Uploader默认配置;
  108. function getOption(objId) {
  109. /*
  110. * 配置文件同webUploader一致,这里只给出默认配置.
  111. * 具体参照:http://fex.baidu.com/webuploader/doc/index.html
  112. */
  113. return {
  114. //按钮容器;
  115. pick:{
  116. id:objId,
  117. label:"点击选择图片"
  118. },
  119. //类型限制;
  120. accept:{
  121. title:"Images",
  122. extensions:"gif,jpg,jpeg,bmp,png",
  123. mimeTypes:"image/*"
  124. },
  125. //配置生成缩略图的选项
  126. thumb:{
  127. width:170,
  128. height:150,
  129. // 图片质量,只有type为`image/jpeg`的时候才有效。
  130. quality:70,
  131. // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
  132. allowMagnify:false,
  133. // 是否允许裁剪。
  134. crop:true,
  135. // 为空的话则保留原有图片格式。
  136. // 否则强制转换成指定的类型。
  137. type:"image/jpeg"
  138. },
  139. //文件上传方式
  140. method:"POST",
  141. //服务器地址;
  142. server:"",
  143. //是否已二进制的流的方式发送文件,这样整个上传内容php://input都为文件内容
  144. sendAsBinary:false,
  145. // 开起分片上传。 thinkphp的上传类测试分片无效,图片丢失;
  146. chunked:true,
  147. // 分片大小
  148. chunkSize:512 * 1024,
  149. //最大上传的文件数量, 总文件大小,单个文件大小(单位字节);
  150. fileNumLimit:50,
  151. fileSizeLimit:5000 * 1024,
  152. fileSingleSizeLimit:500 * 1024
  153. };
  154. }
  155. //实例化Web Uploader
  156. function getUploader( opt ) {
  157. return new WebUploader.Uploader( opt );;
  158. }
  159. //操作进度条;
  160. function showDiyProgress( progress, $diyBar, text ) {
  161. if ( progress >= 100 ) {
  162. progress = progress + '%';
  163. text = text || '上传完成';
  164. } else {
  165. progress = progress + '%';
  166. text = text || progress;
  167. }
  168. var $diyProgress = $diyBar.find('.diyProgress');
  169. var $diyProgressText = $diyBar.find('.diyProgressText');
  170. $diyProgress.width( progress );
  171. $diyProgressText.text( text );
  172. }
  173. //取消事件;
  174. function removeLi ( $li ,file_id ,webUploader) {
  175. webUploader.removeFile( file_id );
  176. var imgId = $li.find("img").attr("img-id");
  177. $(".edit-function-left").find("[img-id="+imgId+"]").parent("div").remove();
  178. if ( $li.siblings('li').length <= 0 ) {
  179. $li.parents('.parentFileBox').remove();
  180. } else {
  181. $li.remove();
  182. }
  183. }
  184. //创建文件操作div;
  185. function createBox( $fileInput, file, webUploader ) {
  186. var file_id = file.id;
  187. var $parentFileBox = $fileInput.next('.parentFileBox');
  188. //添加父系容器;
  189. if ( $parentFileBox.length <= 0 ) {
  190. var div = '<div class="parentFileBox"> \
  191. <ul class="fileBoxUl"></ul>\
  192. </div>';
  193. $fileInput.after( div );
  194. $parentFileBox = $fileInput.next('.parentFileBox');
  195. }
  196. //创建按钮
  197. if ( $parentFileBox.find('.diyButton').length <= 0 ) {
  198. var div = '<div class="diyButton"> \
  199. <a class="diyCancelAll" href="javascript:void(0)">全部取消</a> \
  200. </div>';
  201. $parentFileBox.append( div );
  202. var $startButton = $('.diyStart');
  203. var $cancelButton = $parentFileBox.find('.diyCancelAll');
  204. //开始上传,暂停上传,重新上传事件;
  205. var uploadStart = function (){
  206. webUploader.upload();
  207. // $startButton.text('暂停上传').one('click',function(){
  208. // webUploader.stop();
  209. // $(this).text('继续上传').one('click',function(){
  210. // uploadStart();
  211. // });
  212. // });
  213. }
  214. //绑定开始上传按钮;
  215. $startButton.one('click',uploadStart);
  216. //绑定取消全部按钮;
  217. $cancelButton.bind('click',function(){
  218. var fileArr = webUploader.getFiles( 'queued' );
  219. $.each( fileArr ,function( i, v ){
  220. removeLi( $('#fileBox_'+v.id), v.id, webUploader );
  221. });
  222. });
  223. }
  224. //添加子容器;
  225. var li = '<li id="fileBox_'+file_id+'" class="diyUploadHover"> \
  226. <div class="viewThumb"></div> \
  227. <div class="diyCancel"></div> \
  228. <div class="diySuccess"></div> \
  229. <div class="diyFileName">'+file.name+'</div>\
  230. <div class="diyBar"> \
  231. <div class="diyProgress"></div> \
  232. <div class="diyProgressText">0%</div> \
  233. </div> \
  234. </li>';
  235. $parentFileBox.children('.fileBoxUl').append( li );
  236. //父容器宽度;
  237. // var $width = $('.fileBoxUl>li').length * 180;
  238. // var $maxWidth = $fileInput.parent().width();
  239. // $width = $maxWidth > $width ? $width : $maxWidth;
  240. // $parentFileBox.width( $width );
  241. var $fileBox = $parentFileBox.find('#fileBox_'+file_id);
  242. //绑定取消事件;
  243. var $diyCancel = $fileBox.children('.diyCancel').one('click',function(){
  244. removeLi( $(this).parent('li'), file_id, webUploader );
  245. });
  246. if ( file.type.split("/")[0] != 'image' ) {
  247. var liClassName = getFileTypeClassName( file.name.split(".").pop() );
  248. $fileBox.addClass(liClassName);
  249. return;
  250. }
  251. //生成预览缩略图;
  252. webUploader.makeThumb( file, function( error, dataSrc ) {
  253. if ( !error ) {
  254. $fileBox.find('.viewThumb').append('<img src="'+dataSrc+'" img-id='+file_id+' />');
  255. $(".edit-function-left").append('<div class="edit-F-img" ><img src="'+dataSrc+'" img-id='+file_id+' ></div>');
  256. }
  257. });
  258. }
  259. //获取文件类型;
  260. function getFileTypeClassName ( type ) {
  261. var fileType = {};
  262. var suffix = '_diy_bg';
  263. fileType['pdf'] = 'pdf';
  264. fileType['zip'] = 'zip';
  265. fileType['rar'] = 'rar';
  266. fileType['csv'] = 'csv';
  267. fileType['doc'] = 'doc';
  268. fileType['xls'] = 'xls';
  269. fileType['xlsx'] = 'xls';
  270. fileType['txt'] = 'txt';
  271. fileType = fileType[type] || 'txt';
  272. return fileType+suffix;
  273. }
  274. })( jQuery );