纯AS代码实现可预览本地图片的flash上传客户端(as3.0)

来源:岁月联盟 编辑:zhu 时间:2009-01-04
纯AS代码实现可预览本地图片的flash上传客户端(as3.0)内容简介:需要Flash Player 10+版本的支持,原理就是主要利用fp10中的FileReference.load(),FileReference.data和 Loader.loadBytes()三个方法通过图片加载到内存中,来实现预览本地图片,但这个方式不 需要Flash Player 10+版本的支持,原理就是主要利用fp10中的FileReference.load(),FileReference.data和 Loader.loadBytes()三个方法通过图片加载到内存中,来实现预览本地图片,但这个方式不太适用大图片预览,图片越大内存消耗就越大。

[注意]:

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

2.需要Flash Player 10的支持;

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

实现代码:

view plaincopy to clipboardprint?
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.width:_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,width: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;
}

}

}