/** * @fileoverview flash上传方案,基于龙藏写的ajbridge内的uploader * @author 剑平(明河) **/ KISSY.add('gallery/form/1.3/uploader/type/flash', function (S, Node, UploadType, swfUploader) { var EMPTY = '', LOG_PREFIX = '[uploader-FlashType]:'; if(S.FlashType) return S.FlashType; /** * @name FlashType * @class flash上传方案,基于龙藏写的ajbridge内的uploader * @constructor * @extends UploadType * @requires Node */ function FlashType(config) { var self = this; //调用父类构造函数 FlashType.superclass.constructor.call(self, config); self.isHasCrossdomain(); self._init(); } S.mix(FlashType, /** @lends FlashType.prototype*/{ /** * 事件列表 */ event:S.merge(UploadType.event, { //swf文件已经准备就绪 SWF_READY: 'swfReady', //正在上传 PROGRESS:'progress' }) }); S.extend(FlashType, UploadType, /** @lends FlashType.prototype*/{ /** * 初始化 */ _init:function () { var self = this, swfUploader = self.get('swfUploader'); if(!swfUploader){ S.log(LOG_PREFIX + 'swfUploader对象为空!'); return false; } //SWF 内容准备就绪 swfUploader.on('contentReady', function(ev){ self.fire(FlashType.event.SWF_READY); }, self); //监听开始上传事件 swfUploader.on('uploadStart', self._uploadStartHandler, self); //监听文件正在上传事件 swfUploader.on('uploadProgress', self._uploadProgressHandler, self); //监听文件上传完成事件 swfUploader.on('uploadCompleteData',self._uploadCompleteDataHandler,self); //监听文件失败事件 swfUploader.on('uploadError',self._uploadErrorHandler,self); }, /** * 上传文件 * @param {String} id 文件id * @return {FlashType} */ upload: function (id) { var self = this, swfUploader = self.get('swfUploader'), action = self.get('action'), method = 'POST', data = self.get('data'), name = self.get('fileDataName'); if(!name) name = 'Filedata'; self.set('uploadingId',id); S.mix(data,{"type":"flash"}); swfUploader.upload(id, action, method, data,name); return self; }, /** * 停止上传文件 * @return {FlashType} */ stop:function () { var self = this, swfUploader = self.get('swfUploader'), uploadingId = self.get('uploadingId'); if(uploadingId != EMPTY){ swfUploader.cancel(uploadingId); self.fire(FlashType.event.STOP, {id : uploadingId}); } return self; }, /** * 开始上传事件监听器 * @param {Object} ev ev.file:文件数据 */ _uploadStartHandler : function(ev){ var self = this; self.fire(FlashType.event.START, {'file' : ev.file }); }, /** * 上传中事件监听器 * @param {Object} ev */ _uploadProgressHandler:function (ev) { var self = this; S.mix(ev, { //已经读取的文件字节数 loaded:ev.bytesLoaded, //文件总共字节数 total : ev.bytesTotal }); S.log(LOG_PREFIX + '已经上传字节数为:' + ev.bytesLoaded); self.fire(FlashType.event.PROGRESS, { 'loaded':ev.loaded, 'total':ev.total }); }, /** * 上传完成后事件监听器 * @param {Object} ev */ _uploadCompleteDataHandler : function(ev){ var self = this; var result = self._processResponse(ev.data); self.set('uploadingId',EMPTY); self.fire(FlashType.event.SUCCESS, {result : result}); }, /** *文件上传失败后事件监听器 */ _uploadErrorHandler : function(ev){ var self = this; self.set('uploadingId',EMPTY); self.fire(FlashType.event.ERROR, {msg : ev.msg}); }, /** * 应用是否有flash跨域策略文件 */ isHasCrossdomain:function(){ var domain = location.hostname; S.io({ url:'http://' + domain + '/crossdomain.xml', dataType:"xml", error:function(){ S.log('缺少crossdomain.xml文件或该文件不合法!'); } }) } }, {ATTRS:/** @lends FlashType*/{ /** * 服务器端路径,留意flash必须是绝对路径 */ action:{ value:EMPTY, getter: function (v) { //mod by liuhuisheng for delete the path method // var reg = /^http/; // //不是绝对路径拼接成绝对路径 // if(!reg.test(v)){ // var href = location.href,uris = href.split('/'),newUris; // newUris = S.filter(uris,function(item,i){ // return i < uris.length - 1; // }); // v = newUris.join('/') + '/' + v; // } return v; } }, /** * ajbridge的uploader组件的实例,必须参数 */ swfUploader:{value:EMPTY}, /** * 正在上传的文件id */ uploadingId : {value : EMPTY} }}); //TODO:之所以污染KISSY,是因为ImageUploader和Uploader同时引用时存在bug S.FlashType = FlashType; return FlashType; }, { requires: ['node', './base'] });