zoukankan      html  css  js  c++  java
  • [AS3]纯AS代码实现可预览本地图片的flash上传客户端

    [AS3]纯AS代码实现可预览本地图片的flash上传客户端

         需要Flash Player 10+版本的支持,原理就是主要利用fp10中的FileReference.load(),FileReference.data和Loader.loadBytes()三个方法通过图片加载到内存中,来实现预览本地图片,但这个方式不太适用大图片预览,图片越大内存消耗就越大。



    [注意]

    1.我这边图片上传路径是无效的,所以图片上传失败是正常的,你们可以改一下上传路径即可;

    2.需要Flash Player 10的支持;

    3.这次主要研究是预览本地图片功能。


    package project.test
    {
    import flash.display.*;
    import flash.geom.Rectangle;
    import flash.net.*;
    import flash.text.*;
    import flash.filters.*;
    import flash.events.*;
    import flash.system.Security;

    import fl.controls.Button;
    import fl.controls.ProgressBar;
    import fl.controls.ProgressBarMode;

    /**
    * @link kinglong@gmail.com
    * @author Kinglong
    * @playerversion fp10
    */
    [SWF(width="500", height="300", frameRate="24", backgroundColor="#FFFFFF")]
    public class TestUpload extends Sprite {
      
       private const DEFAULT_UPLOAD_PAGE:String = "http://test.klstudio.com/upload.asp";  
       private const BOX_WIDTH:uint = 500;
       private const BOX_HEIGHT:uint = 300;
      
       private const STATE_CACHE:String = "cache";
       private const STATE_UPLOAD:String = "upload";
      
       private var _filters:Array;
       private var _file:FileReference;
       private var _loader:Loader;
       private var _progress:ProgressBar;
       private var _state:String;
       private var _buttons:Array;
       private var _labels:Array;
       private var _txts:Array;
       private var _rect:Rectangle;
       private var _state_txt:TextField;
      
       public function TestUpload() {
        Security.allowDomain("*");
       
        _buttons = [];
        _txts = [];
        _labels = ["文件名称:","文件类型:","文件大小:","修改时间:"];
       
        _rect = new Rectangle(20, 80, 180, 180);
        _state = STATE_CACHE;
       
        //背景;
        this.graphics.beginFill(0x333333);
        this.graphics.drawRoundRect(0, 0, BOX_WIDTH, BOX_HEIGHT, 10, 10);
        this.graphics.endFill();
        this.graphics.beginFill(0xEFEFEF);
        this.graphics.drawRoundRect(1, 1, BOX_WIDTH - 2, BOX_HEIGHT - 2, 10, 10);
        this.graphics.endFill();
        this.graphics.beginFill(0x666666);
        this.graphics.drawRoundRect(10, 30, BOX_WIDTH - 20, BOX_HEIGHT - 60, 20, 20);   
        this.graphics.endFill();
        this.graphics.beginFill(0xFEFEFE);
        this.graphics.drawRoundRect(11, 31, BOX_WIDTH - 22, BOX_HEIGHT - 62, 20, 20);
        this.graphics.endFill();
       
        this.graphics.beginFill(0xCCCCCC);
        this.graphics.drawRect(11, 70, BOX_WIDTH - 22, 1);
        this.graphics.endFill();
       
        this.graphics.beginFill(0x000000);
        this.graphics.drawRect(_rect.x-1, _rect.y-1, _rect.width+2, _rect.height+2);
        this.graphics.endFill();   
        this.graphics.beginFill(0xEEEEEE);
        this.graphics.drawRect(_rect.x, _rect.y, _rect.width, _rect.height);
        this.graphics.endFill();
       
       
        //标题;
        var label:TextField;   
        label = getLabel("图片上传(预览图片版) by Kinglong", getTextFormat(0xFFFFFF, 14, true));
        label.x = 10;
        label.y = 5;
        label.filters = [getLabelFilter(0x000000)];
        this.addChild(label);
       
        for (var i:uint = 0; i < _labels.length; i++ ) {   
         label = getLabel(_labels[i], getTextFormat(0x333333, 12), false, false);    
         label.x = _rect.right+5;
         label.y = _rect.y + 25 * i;
         label.width = 280;
         label.height = 20;
         _txts.push(label);
         this.addChild(label);
        }   
       
        _state_txt = getLabel("状态:", getTextFormat(0x333333, 12));
        _state_txt.x = 10;
        _state_txt.y = BOX_HEIGHT - _state_txt.height - 5;
        this.addChild(_state_txt);
       
        //按钮;
        var button:Button;
        button = getButton("选择文件", 80);   
        button.move(20, 40);
       
        button = getButton("上传文件", 80);   
        button.move(105, 40);
        button.enabled = false;
       
        //进度条;
        _progress = new ProgressBar();
        _progress.move(190, 40);
        _progress.setSize(290,22);
        _progress.mode = ProgressBarMode.MANUAL;      
        this.addChild(_progress);
       
        //文件类型;
        _filters = [];
        var filter:FileFilter;   
        filter = new FileFilter("所有支持图片文件(*.jpg,*.jpeg,*.gif,*.png)", "*.jpg;*.jpeg;*.gif;*.png");
        _filters[_filters.length] = filter;
        filter = new FileFilter("JPEG files(*.jpg,*.jpeg)","*.jpg;*.jpeg");
        _filters[_filters.length] = filter;
        filter = new FileFilter("GIF files (*.gif)","*.gif");
        _filters[_filters.length] = filter;
        filter = new FileFilter("PNG files(*.png)","*.png");
        _filters[_filters.length] = filter;
       
        _file = new FileReference();
        _file.addEventListener(Event.COMPLETE, fileHandler);
        _file.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA, fileHandler);
        _file.addEventListener(Event.SELECT, fileHandler);
        _file.addEventListener(Event.OPEN, fileHandler);   
        _file.addEventListener(ProgressEvent.PROGRESS, fileHandler);
        _file.addEventListener(SecurityErrorEvent.SECURITY_ERROR, fileHandler);
        _file.addEventListener(IOErrorEvent.IO_ERROR, fileHandler);
        _file.addEventListener(HTTPStatusEvent.HTTP_STATUS, fileHandler);
       
        _loader = new Loader();
        _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadHandler);
        this.addChild(_loader);
       }
      
       public function get state():String {
        return _state;
       }
      
       private function clickHandler(event:MouseEvent):void {
        switch(event.target) {
         case _buttons[0]:
          _file.browse(_filters);
          break;
         case _buttons[1]:
          _file.upload(new URLRequest(DEFAULT_UPLOAD_PAGE));
          _state = STATE_UPLOAD;     
          _buttons[0].enabled = false;
          _buttons[1].enabled = false;
          break;
        }
       }
      
       private function loadHandler(event:Event):void {
        _loader.scaleX = _loader.scaleY = 1;
        var w:uint = _loader.width;
        var h:uint = _loader.height;
        if (w > _rect.width || h > _rect.height) {    
         var ip:Number = w / h;
         var lp:Number = _rect.width / _rect.height;   
         _loader.width = (ip > lp)?_rect._rect.height*ip;
         _loader.height = (ip > lp)?_rect.width / ip:_rect.height;
        }
        _loader.x = _rect.x + (_rect.width - _loader.width) / 2;
        _loader.y = _rect.y + (_rect.height - _loader.height) / 2;   
        _loader.visible = true;
       }
      
       private function fileHandler(event:Event):void {
        switch(event.type) {
         case Event.COMPLETE:
          if(state == STATE_CACHE){
           _loader.loadBytes(_file.data);
          }
          break;
         case DataEvent.UPLOAD_COMPLETE_DATA:
          debug("图片上传完成!");
          _buttons[0].enabled = true;
          _buttons[1].enabled = false;
          _progress.setProgress(0, 1);
          break;
         case Event.SELECT:
          _txts[0].text = _labels[0] + _file.name;
          _txts[1].text = _labels[1] + _file.type;
          _txts[2].text = _labels[2] + ((_file.size > 1024 * 1024)?Math.round(_file.size * 10 / (1024*1024))/10 + "MB":Math.round(_file.size * 10 / 1024)/10 + "KB");     
          _txts[3].text = _labels[3] + date2str(_file.modificationDate);
          _buttons[0].enabled = true;
          _buttons[1].enabled = true;
          _file.load();
          _state = STATE_CACHE;
          _loader.visible = false;
          debug("图片已经准备!");
          break;
         case Event.OPEN:
          if(state == STATE_UPLOAD){
           debug("正在上传图片...");
          }
          break;
         case ProgressEvent.PROGRESS:
          if (state == STATE_UPLOAD) {
           var pEvent:ProgressEvent = event as ProgressEvent;
           _progress.setProgress(pEvent.bytesLoaded, pEvent.bytesTotal);
          }
          break;
         case SecurityErrorEvent.SECURITY_ERROR:
         case IOErrorEvent.IO_ERROR:
         case HTTPStatusEvent.HTTP_STATUS:     
          if (state == STATE_UPLOAD) {
           debug("图片上传失败!");
           _buttons[0].enabled = true;
           _buttons[1].enabled = true;
          }else {
           debug("图片缓冲失败!");
          }
          _progress.setProgress(0, 1);
          break;
        
        }
       }
      
       private function getButton(lbl:String,uint=120):Button {
        var button:Button = new Button();
        button.label = lbl;
        button.setSize(width, 22);
        button.setStyle("textFormat", getTextFormat());
        button.setStyle("disabledTextFormat", getTextFormat(0x999999));
        button.setStyle("textPadding",4);
        button.addEventListener(MouseEvent.CLICK, clickHandler);   
        this.addChild(button);
        _buttons.push(button);
        return button;
       }
      
       private function getLabel(label:String, format:TextFormat, selectable:Boolean = false, autoSize:Boolean = true):TextField {   
        var lbl:TextField = new TextField();
        lbl.selectable = selectable;
        lbl.defaultTextFormat = format;
        if(autoSize){
         lbl.autoSize = TextFieldAutoSize.LEFT;
        }
        lbl.text = label;
        return lbl;
       }
      
       private function getTextFormat(color:uint=0x000000,size:uint = 12,bold:Boolean=false):TextFormat {
        var format:TextFormat = new TextFormat();
        format.font = "宋体";
        format.color = color;
        format.size = size;
        format.bold = bold;
        return format;
       }
      
       private function getLabelFilter(color:uint=0xFFFFFF):BitmapFilter {
                var alpha:Number = 0.8;
                var blurX:Number = 2;
                var blurY:Number = 2;
                var strength:Number = 3;
                var inner:Boolean = false;
                var knockout:Boolean = false;
                var quality:Number = BitmapFilterQuality.HIGH;

                return new GlowFilter(color,
                                      alpha,
                                      blurX,
                                      blurY,
                                      strength,
                                      quality,
                                      inner,
                                      knockout);
       }
      
       private function date2str(day:Date):String {
        var str:String = day.getFullYear() + "-";
        str += num2str(day.getMonth() + 1) + "-";
        str += num2str(day.getDate()) + " ";
        str += num2str(day.getHours()) + ":";
        str += num2str(day.getMinutes()) + ":";
        str += num2str(day.getSeconds());
        return str;
       }
      
       private function num2str(val:Number):String {
        var str:String = "00" + val;
        return str.substr(str.length - 2, 2);   
       }
      
       private function debug(message:String):void {
        _state_txt.text = message;
       }
      
    }

    }


  • 相关阅读:
    软件架构设计箴言理解
    解决vs2010没有NET Framework 2.0和3.5
    .NET连接数据库实例
    CSS选择器大全
    SilverLight全屏代码
    SilverLight数字时钟 > 我的博客有SilverLight了
    comboBox设置为只读(只选)
    WinForm 单例模式实例
    标识种子和标识增量
    jQuery固定DIV实现“返回顶部”
  • 原文地址:https://www.cnblogs.com/see7di/p/2239924.html
Copyright © 2011-2022 走看看