/**
* @description 针对文件的操作,读取,上传
*/
Rsd.define('Rsd.data.File', {
extend:'Rsd.common.Object',
xtype:'ajax-file',
type: 'POST',
cache: false,
/**
* 文件元数据
*/
metaInfo:{},
/**
* 支持的文件类型
*/
types:[],
/**
* 文件大小自定义限制,大于该值文件不处理
*/
maxSize : 1024 * 1024 * 10, // 限制大小10MB
/*
* */
constructor: function File(config) {
Rsd.apply(this,config||{});
},
/**
* 将file转成dataUrl ,在callback中返回
* @param {*} file
*/
readFile: function readFile(file,callback) {
//console.log(file);
var me = this;
// 文件类型检查
if (me.types && me.types.length > 0 && me.types.indexOf(file.type.split("/")[1]) < 0) {
throw new Error('不支持该文件类型'+file.type);
}
// 文件大小限制
if (file.size > me.maxSize) {
throw new Error('文件大小超过最大限制:'+me.maxSize/1024/1024 + 'MB');
}
// 存储文件相关信息
this.metaInfo.type = file.type || 'image/jpeg';
this.metaInfo.size = file.size;
this.metaInfo.name = file.name;
this.metaInfo.lastModifiedDate = file.lastModifiedDate;
var reader = new FileReader();
// file转dataUrl是个异步函数,要将代码写在回调里
reader.onload = function (e) {
callback(e.target.result);
};
//读取文件
reader.readAsDataURL(file);
},
/**
* 将dataUrl转化为 文件对象
* @param {*} dataURL
*/
getFile: function getFile(dataURL) {
var me = this;
var binaryString = window.atob(dataURL.split(',')[1]);
var arrayBuffer = new ArrayBuffer(binaryString.length);
var intArray = new Uint8Array(arrayBuffer);
for (let i = 0, j = binaryString.length; i < j; i++) {
intArray[i] = binaryString.charCodeAt(i);
}
var data = [intArray];
var blob;
try
{
blob = new Blob(data, { type: me.metaInfo.type });
}
catch (error)
{
window.BlobBuilder = window.BlobBuilder ||
window.WebKitBlobBuilder ||
window.MozBlobBuilder ||
window.MSBlobBuilder;
if (error.name === 'TypeError' && window.BlobBuilder) {
var builder = new BlobBuilder();
builder.append(arrayBuffer);
blob = builder.getBlob(me.metaInfo.type);
}
else
{
throw new Error('版本过低,不支持上传图片');
}
}
return new File([blob], me.metaInfo.name);
},
/***
* post包含文件的数据
*/
upload:function upload(url,data,callback)
{
var _ajax = Rsd.create('Rsd.data.Ajax', {
url:url,
contentType:false,//文件上传 不设置任何类型, 使用默认值:multipart/form-data不对字符编码。当使用有文件上传控件的表单时,该值是必需的。
token:Rsd.getAppToken(),
appId:Rsd.getAppId()
});
_ajax.on('uploadloadstart',this.uploadStart);
_ajax.on('uploadloadend',this.uploadEnd);
_ajax.on('uploadprogress',this.uploadProgress);
_ajax.on('uploadload',this.uploadComplete);
_ajax.on('uploaderror',this.uploadFailed);
_ajax.on('uploadabort',this.uploadAbort);
_ajax.request(data,callback);
},
/**
*
* @param {*} evt
*/
uploadProgress:function uploadProgress(evt)
{
var me = this;
if(evt.lengthComputable)
{
if(evt.lengthComputable){
me.funApplyByIOC(progress,[{value:evt.loaded,max:evt.total}]);
}
if(Rsd.isDebug)
{
var progress = Math.round(evt.loaded * 100 / evt.total);
console.debug("上传进度" + progress);
}
}
},
/**
*
* @param {*} evt
*/
uploadStart:function uploadStart(evt)
{
console.debug ("开始上传!");
},
/**
*
* @param {*} evt
*/
uploadComplete : function uploadComplete (evt)
{
if(evt.loaded == 0)
{
console.debug ("上传失败!");
}
else
{
console.debug ("上传完成!");
var response = JSON.parse(evt.target.responseText);
console.debug (response);
}
},
/***
*
*/
uploadFailed : function uploadFailed(evt)
{
console.debug ("上传出错");
},
/***
*
*/
uploadAbort : function uploadAbort(evt)
{
console.debug( "上传中止!");
}
},function (type) {
});