/**
|
* @fileoverview flash上传方案,基于龙藏写的ajbridge内的uploader
|
* @author 剑平(明河)<minghe36@126.com>
|
**/
|
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'] });
|