/** * @fileoverview ajax方案上传 * @author 剑平(明河),紫英 **/ KISSY.add('gallery/form/1.3/uploader/type/ajax',function(S, Node, UploadType) { var EMPTY = '',$ = Node.all,LOG_PREFIX = '[uploader-AjaxType]:'; /** * @name AjaxType * @class ajax方案上传 * @constructor * @requires UploadType */ function AjaxType(config) { var self = this; //调用父类构造函数 AjaxType.superclass.constructor.call(self, config); } S.mix(AjaxType, /** @lends AjaxType.prototype*/{ /** * 事件列表 */ event : S.merge(UploadType.event,{ PROGRESS : 'progress' }) }); //继承于Base,属性getter和setter委托于Base处理 S.extend(AjaxType, UploadType, /** @lends AjaxType.prototype*/{ /** * 上传文件 * @param {File} fileData 文件数据 * @return {AjaxType} */ upload : function(fileData) { //不存在文件信息集合直接退出 if (!fileData) { S.log(LOG_PREFIX + 'upload(),fileData参数有误!'); return false; } var self = this; self._setFormData(); self._addFileData(fileData); self.send(); return self; }, /** * 停止上传 * @return {AjaxType} */ stop : function() { var self = this,xhr = self.get('xhr'); if (!S.isObject(xhr)) { S.log(LOG_PREFIX + 'stop(),io值错误!'); return false; } //中止ajax请求,会触发error事件 xhr.abort(); self.fire(AjaxType.event.STOP); return self; }, /** * 发送ajax请求 * @return {AjaxType} */ send: function () { var self = this, //服务器端处理文件上传的路径 action = self.get('action'), data = self.get('formData'); var xhr = new XMLHttpRequest(); //TODO:如果使用onProgress存在第二次上传不触发progress事件的问题 xhr.upload.addEventListener('progress',function(ev){ self.fire(AjaxType.event.PROGRESS, { 'loaded': ev.loaded, 'total': ev.total }); }); xhr.onload = function(ev){ var result = self._processResponse(xhr.responseText); self.fire(AjaxType.event.SUCCESS, {result : result}); }; xhr.open("POST", action, true); data.append("type", "ajax"); xhr.send(data); // 重置FormData self._setFormData(); self.set('xhr',xhr); return self; }, /** * 设置FormData数据 */ _setFormData:function(){ var self = this; try{ self.set('formData', new FormData()); self._processData(); }catch(e){ S.log(LOG_PREFIX + 'something error when reset FormData.'); S.log(e, 'dir'); } }, /** * 处理传递给服务器端的参数 */ _processData : function() { var self = this,data = self.get('data'), formData = self.get('formData'); //将参数添加到FormData的实例内 S.each(data, function(val, key) { formData.append(key, val); }); self.set('formData', formData); }, /** * 将文件信息添加到FormData内 * @param {Object} file 文件信息 */ _addFileData : function(file) { if (!S.isObject(file)) { S.log(LOG_PREFIX + '_addFileData(),file参数有误!'); return false; } var self = this, formData = self.get('formData'), fileDataName = self.get('fileDataName'); formData.append(fileDataName, file); self.set('formData', formData); } }, {ATTRS : /** @lends AjaxType*/{ /** * 表单数据对象 */ formData : {value : EMPTY}, /** * ajax配置 */ ajaxConfig : {value : { type : 'post', processData : false, cache : false, dataType : 'json', contentType: false } }, xhr : {value : EMPTY}, fileDataName : {value : EMPTY}, form : {value : {}}, fileInput : {value : EMPTY} } }); return AjaxType; }, {requires:['node','./base']});