zxxFile.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. /*
  2. * zxxFile.js 基于HTML5 文件上传的核心脚本 http://www.zhangxinxu.com/wordpress/?p=1923
  3. * by zhangxinxu 2011-09-12
  4. */
  5. var ZXXFILE = {
  6. fileInput: null, //html file控件
  7. dragDrop: null, //拖拽敏感区域
  8. upButton: null, //提交按钮
  9. url: "", //ajax地址
  10. fileFilter: [], //过滤后的文件数组
  11. filter: function(files) { //选择文件组的过滤方法
  12. return files;
  13. },
  14. onSelect: function() {}, //文件选择后
  15. onDelete: function() {}, //文件删除后
  16. onDragOver: function() {}, //文件拖拽到敏感区域时
  17. onDragLeave: function() {}, //文件离开到敏感区域时
  18. onProgress: function() {}, //文件上传进度
  19. onSuccess: function() {}, //文件上传成功时
  20. onFailure: function() {}, //文件上传失败时,
  21. onComplete: function() {}, //文件全部上传完毕时
  22. /* 开发参数和内置方法分界线 */
  23. //文件拖放
  24. funDragHover: function(e) {
  25. e.stopPropagation();
  26. e.preventDefault();
  27. this[e.type === "dragover"? "onDragOver": "onDragLeave"].call(e.target);
  28. return this;
  29. },
  30. //获取选择文件,file控件或拖放
  31. funGetFiles: function(e) {
  32. // 取消鼠标经过样式
  33. this.funDragHover(e);
  34. // 获取文件列表对象
  35. var files = e.target.files || e.dataTransfer.files;
  36. //继续添加文件
  37. this.fileFilter = this.fileFilter.concat(this.filter(files));
  38. this.funDealFiles();
  39. return this;
  40. },
  41. //选中文件的处理与回调
  42. funDealFiles: function() {
  43. for (var i = 0, file; file = this.fileFilter[i]; i++) {
  44. //增加唯一索引值
  45. file.index = i;
  46. }
  47. //执行选择回调
  48. this.onSelect(this.fileFilter);
  49. return this;
  50. },
  51. //删除对应的文件
  52. funDeleteFile: function(fileDelete) {
  53. var arrFile = [];
  54. for (var i = 0, file; file = this.fileFilter[i]; i++) {
  55. if (file != fileDelete) {
  56. arrFile.push(file);
  57. } else {
  58. this.onDelete(fileDelete);
  59. }
  60. }
  61. this.fileFilter = arrFile;
  62. return this;
  63. },
  64. //文件上传
  65. funUploadFile: function() {
  66. var self = this;
  67. if (location.host.indexOf("sitepointstatic") >= 0) {
  68. //非站点服务器上运行
  69. return;
  70. }
  71. // for (var i = 0, file; file = this.fileFilter[i]; i++) {
  72. // (function(file) {
  73. file = this.fileFilter[this.fileFilter.length-1]
  74. console.log(file);
  75. var xhr = new XMLHttpRequest();
  76. if (xhr.upload) {
  77. // 上传中
  78. xhr.upload.addEventListener("progress", function(e) {
  79. self.onProgress(file, e.loaded, e.total);
  80. }, false);
  81. // 文件上传成功或是失败
  82. xhr.onreadystatechange = function(e) {
  83. if (xhr.readyState == 4) {
  84. if (xhr.status == 200) {
  85. self.onSuccess(file, xhr.responseText);
  86. self.funDeleteFile(file);
  87. if (!self.fileFilter.length) {
  88. //全部完毕
  89. self.onComplete();
  90. }
  91. } else {
  92. self.onFailure(file, xhr.responseText);
  93. }
  94. }
  95. };
  96. // 开始上传
  97. xhr.open("POST", self.url, true);
  98. xhr.setRequestHeader("X_FILENAME", encodeURI(file.name));
  99. console.log(file)
  100. xhr.send(file);
  101. }
  102. // })(file);
  103. // }
  104. },
  105. init: function() {
  106. var self = this;
  107. if (this.dragDrop) {
  108. this.dragDrop.addEventListener("dragover", function(e) { self.funDragHover(e); }, false);
  109. this.dragDrop.addEventListener("dragleave", function(e) { self.funDragHover(e); }, false);
  110. this.dragDrop.addEventListener("drop", function(e) { self.funGetFiles(e); }, false);
  111. }
  112. //文件选择控件选择
  113. if (this.fileInput) {
  114. this.fileInput.addEventListener("change", function(e) { self.funGetFiles(e); }, false);
  115. }
  116. //上传按钮提交
  117. if (this.upButton) {
  118. this.upButton.addEventListener("click", function(e) { self.funUploadFile(e); }, false);
  119. }
  120. }
  121. };