Source: data/File.js

/** 
 * @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) {

});