多項目上傳文件解決方案之:Flash上傳插件

這個插件的主要功能是上傳單一文件。暫時沒有考慮多文件上傳功能。在這裏主要介紹下相關參數及flash實現。html

主要參數及說明:json

     config:用來肯定使用哪個配置文件。服務器

     type:肯定使用哪個分類。app

     jsFunName:上傳完成後,回調的js方法名稱。佈局

flash實現主要思路流程:測試

      一、加載時根據傳遞參數去中轉服務器上獲取相關的參數(上傳文件大小、文件類型)。須要中轉服務器對外提供一個接口。接口下面有詳細介紹。this

      二、當用戶選擇上傳文件時作出相應的判斷處理(文件大小是否在指定的範圍內、文件類型是否容許上傳)。url

      三、當用戶選擇的文件符合要求是,調用相關接口,上傳文件至中轉服務器上。同時帶上相關的參數(config和type)。這裏也須要中轉服務器提供一個接口。spa

爲了方便後期其餘項目的使用,將中轉服務器接口訪問地址的根路徑寫入xml,存放在站點的根目錄下。插件

upload.xml

<?xml version="1.0" encoding="utf-8" ?>
<root>
  <baseURL>http://upload.xxx.com/</baseURL>
</root>

一、爲了方便開發中測試,先修改下html模板。加上相關參數。見下圖:

QQ截圖20131216162451

一、flash佈局

<mx:ProgressBar id="uploadProgressBar" x="4" y="3" width="180" height="24"  maximum="100" minimum="0" labelPlacement="center" mode="manual" label="%3%%" textAlign="center" creationComplete="uploadProgressBar_creationCompleteHandler(event)"/>
    <s:Button id="btnSelect" x="187" y="3" height="24" label="瀏覽" click="btnSelect_clickHandler(event)"/>
    <s:Label id="lbTips" x="264" y="13" text="{strTips}"/>

說明:mx:ProgressBar:進度條,顯示上傳進度。

        s:Button:瀏覽按鈕。選擇上傳文件。

        s:Label:提示標籤。各類錯誤提示。strTips爲元數據。

二、addedToStage事件:addedToStageHandler

protected function addedToStageHandler(event:Event):void
{
    //---- 獲取參數
    var appconfig:String = this.loaderInfo.parameters['appconfig'];
    var type:String = this.loaderInfo.parameters['type'];
    jsFunName = this.loaderInfo.parameters['jsfun'];
    
    if(StringUtil.isNullOrEmpty(appconfig)){
        strTips='缺乏參數';
        return;
    }
    if(StringUtil.isNullOrEmpty(type)){
        strTips='缺乏參數[type]';
        return;
    }
    if(StringUtil.isNullOrEmpty(jsFunName)){                
        strTips='缺乏參數[jsfun]';
        return;
    }
    loadXml(appconfig,type);                
}

三、讀取配置文件:LoadXml

//加載xml配置路徑
protected function loadXml(appconfig:String,type:String):void{
    var xmlLoader:URLLoader = new URLLoader();
    var xmlData:XML = new XML();
    xmlLoader.addEventListener(Event.COMPLETE, onLoadXML);
    xmlLoader.addEventListener(IOErrorEvent.IO_ERROR,ioError);
    xmlLoader.load(new URLRequest("/upload.xml"));
    //加載成功
    function onLoadXML(ev:Event):void{
        xmlData = new XML(ev.target.data);
        baseURL=xmlData.baseURL;
        loadConfig(appconfig,type);
    }
    //io.error
    function ioError(e:IOErrorEvent):void{
        strTips='xml文件讀取失敗';
    }
}

四、加載配置文件:LoadConfig

//加載配置信息 獲取上傳的文件類型及大小
protected function loadConfig(appconfig:String,type:String):void{
    //---上傳類型文件等參數
    var request_config:String = StringUtil.format('appconfig={0}&type={1}',appconfig,type);
    //上傳文件大小類型配置
    var req:URLRequest = new URLRequest(baseURL+'/upload/get_config');
    req.data = request_config;
    req.method='POST';
    var loader:URLLoader = new URLLoader();
    loader.addEventListener(Event.COMPLETE,function(e:Event):void{
        var ary:Array = loader.data.split('|');
        allowFileSize = parseInt(ary[0]);
        allowFileExt = ary[1];
        allowAryFileExt =ary[1].split(';');
        var dot:RegExp = /\./gi;
        allowFileFilter=allowFileExt.replace(dot,'*.');
        
        if(allowFileSize>0){
            init(request_config);
        }else{
            strTips = StringUtil.format('[{0}.{1}]配置錯誤',appconfig,type);
        }
    });
    loader.load(req);
}

五、加載完成配置信息後能夠設置自定義事件及初始化相關變量:init

//----自定義的加載事件
protected function init(request_config:String):void
{
    // 定義上傳請求                
    urlrequest = new URLRequest(baseURL+'/upload');
    urlrequest.data = request_config;
    // 綁定上傳事件
    fileRef.addEventListener(Event.SELECT,fileSelectHandler);
    fileRef.addEventListener(ProgressEvent.PROGRESS,function(event: ProgressEvent): void
    {
        uploadProgressBar.label = '%3%%';
        uploadProgressBar.setProgress(event.bytesLoaded, event.bytesTotal);
        if(event.bytesLoaded==event.bytesTotal){
            uploadProgressBar.label = '上傳完成,處理中...';
        }
     });
    fileRef.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA,uploadImageCompleteHandler);            
}

六、選擇文件:btnSelect_clickHandler

//----選擇文件
protected function btnSelect_clickHandler(event:MouseEvent):void
{
    if(allowFileFilter.length>0){
        fileRef.browse([new FileFilter('容許文件('+allowFileFilter+')', allowFileFilter),
                        new FileFilter("全部文件(*.*)", "*.*")
                                ]);
    }
}

七、文件選擇完成,文件判斷:fileSelectHandler

//文件選擇完成
protected function fileSelectHandler(evt:Event):void
{
    //----文件檢查-----
    var size:int  =  fileRef.size;
    var ext:String = fileRef.type;

    if(allowAryFileExt==null || allowAryFileExt.indexOf(ext)==-1){
        strTips = '只容許['+allowFileExt+']類型';
        return;
    }
    if(allowFileSize < size){
        strTips = '最大爲'+(allowFileSize/1024/1024)+'M.';
        return;
    }
    urlrequest.method='POST';
    fileRef.upload(urlrequest,'file_data');
    btnSelect.enabled=false;//上傳中設置瀏覽按鈕不可用
}

八、文件上傳完成:uploadImageCompleteHandler

//文件上傳完成
protected function uploadImageCompleteHandler(evt:DataEvent):void {
    var upload_data:Object = com.adobe.serialization.json.JSON.decode( evt.data);
    uploadWait();
    btnSelect.enabled=true;
    if(upload_data.hasOwnProperty('error_code')){
        strTips = '錯誤代碼:'+upload_data.error_code;
    }else if(upload_data.hasOwnProperty('fileid') && upload_data.hasOwnProperty('source')){
        strTips = '上傳成功';
        ExternalInterface.call(jsFunName,upload_data.fileid,upload_data.source);
    }
}

 

到此爲止,基本上一個上傳單一文件的flash就開發完成了。

相關文章
相關標籤/搜索