Flash实现图片上传(实现浏览器端图片预览)

     由于项目需要,在客户上传搭配的过程中要实现图片浏览器预览的功能,实在是纠结。思考过,个人认为要实现图片的本地预览可以通过编写ActiveX控件或者使用Flash做到。当然编写ActiveX控件会在浏览器端出现控件安装的过程,十分不友好,况且很多浏览器认为ActiveX控件是不安全的会屏蔽,只能抛弃。本以为Flash实现会很容易,可是到做的时候才发现,Flash 10在真正支持图片的本地预览(FileReference),当然产品的需求还有些变态的,需要实现AS与JS的互调。贴出代码,并对关键点加以说明。

View Code
package 
{
import com.yahoo.astra.fl.charts.axes.IClusteringAxis;
import fl.events.InteractionInputType;
import flash.display.
* ;
import flash.geom.Rectangle;
import flash.net.
* ;
import flash.text.
* ;
import flash.filters.
* ;
import flash.events.
* ;
import flash.system.Security;
import flash.external.ExternalInterface;

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

/* *
* ...
* @author Olar Tan
*/
public class Main extends Sprite 
{
// fontColor=#ff4570;
// bgColor=#1a1a1a;
private const DEFAULT_UPLOAD_PAGE:String  =   " http://www.xxx.com/upload.aspx "
private const BOX_WIDTH:uint 
=   400 ;
private const BOX_HEIGHT:uint 
=   600 ;

private const STATE_CACHE:String 
=   " cache " ;
private const STATE_UPLOAD:String 
=   " upload " ;

[Embed(source 
=   ' ../lib/bg.png ' )]
private 
var  Pic:Class;  // ;

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;
private 
var  _lblChoose:TextField;

private 
var  _upload_url:String;
private 
var  _contactId:String;
private 
var  _isPkFlag:String;
private 
var  _pkId:String;
private 
var  _upload_complete_callback:String;

private 
var  _pic: *   =   new  Pic();

public 
function  Main(): void  
{
if  (stage) init();
else  addEventListener(Event.ADDED_TO_STAGE, init);
}

private 
function  init(e:Event  =   null ): void  
{

_upload_url 
=  stage.loaderInfo.parameters[ " uploadURL " ];
_contactId 
=  stage.loaderInfo.parameters[ " contactId " ];
_pkId 
=  stage.loaderInfo.parameters[ " pkId " ];
_isPkFlag 
=  stage.loaderInfo.parameters[ " isPkFlag " ];
_upload_complete_callback 
=  stage.loaderInfo.parameters[ " uploadCompleteCallback " ];


ExternalInterface.addCallback(stage.loaderInfo.parameters[
" outerUploadPhotoCallback " ], outerEventUploadPhoto);
ExternalInterface.addCallback(stage.loaderInfo.parameters[
" outerChoosePhotoCallback " ],outerEventChoosePhoto);
removeEventListener(Event.ADDED_TO_STAGE, init);
Security.allowDomain(
" * " );

_buttons 
=  [];
_txts 
=  [];
_labels 
=  [ " 文件名称: " , " 文件类型: " , " 文件大小: " , " 修改时间: " ];

_rect 
=   new  Rectangle( 0 30 400 600 );
_state 
=  STATE_CACHE;
this .addChild(_pic);


// 背景;
this .graphics.beginFill( 0xffffff );
this .graphics.drawRect( 0 0 400 30 );
this .graphics.endFill();

// 标题;
var  label:TextField;
label 
=  getLabel( " 搭配照片: " , getTextFormat( 0x333333 14 false ));
label.x 
=   0 ;
label.y 
=   5 ;
this .addChild(label);

// 重新选择按钮
_lblChoose  =  getLabel( " 重新选择照片 " , getTextFormat( 0xff4570 14 true true ),  true );
_lblChoose.x 
=   90 ;
_lblChoose.y 
=   5 ;
_lblChoose.addEventListener(MouseEvent.CLICK, clickHandler);
this .addChild(_lblChoose);
_lblChoose.visible 
=   false ;

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 
=   170 ;
_state_txt.y 
=   5 ;
// this.addChild(_state_txt);

// 按钮选择
var  button:Button;
button 
=  getButton( " 选择文件 " 130 ); 
button.move(
135 220 );

// 按钮上传
button  =  getButton( " 上传文件 " 80 ); 
button.move(
300 5 );
button.enabled 
=   false ;
button.visible 
=   false ;

// 进度条;
_progress  =   new  ProgressBar();
_progress.move(
20 80 );
_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  _lblChoose:
case  _buttons[ 0 ]:
_file.browse(_filters);
break ;
case  _buttons[ 1 ]:
var  urlRequest:URLRequest  =   new  URLRequest(_upload_url);
_file.upload(urlRequest);
_state 
=  STATE_UPLOAD; 
_buttons[
0 ].enabled  =   false ;
_buttons[
1 ].enabled  =   false ;
break ;
}
}

private 
function  outerEventUploadPhoto(mediaStyle: int ,mediaDesc:String): void  {
try
{
var  urlRequest:URLRequest  =   new  URLRequest(_upload_url + " ?contactId= " + _contactId + " &pkId= " + _pkId + " &isPkFlag= " + _isPkFlag + " &mediaStyle= " + mediaStyle + " &mediaDesc= " + mediaDesc);
_file.upload(urlRequest);
_state 
=  STATE_UPLOAD; 
}
catch (e:Error){}



private 
function  outerEventChoosePhoto(): void  {
debug(
" 选择图片. " );
}

private 
function  loadHandler(event:Event): void  {

_buttons[
0 ].visible  =   false ;
_lblChoose.visible 
=   true ;

_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  {
var  result:String  =   '' ;
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 );
var  dEvent:DataEvent  =  event as DataEvent;
result
=  dEvent.data.toString();
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;
this .removeChild(_pic);
_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 );
result 
=   " [00]-[上传失败] " ;
break ;

}
if  (result != ''   &&  ExternalInterface.available)
{
ExternalInterface.call(_upload_complete_callback, result);
}
}

private 
function  getButton(lbl:String,width:uint = 120 ):Button {
var  button:Button  =   new  Button();
button.label 
=  lbl;
button.setSize(width, 
34 ); 
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, isHand:Boolean = false ,selectable: 
Boolean 
=   false , autoSize:Boolean  =   true ):TextField { 
var  lbl:TextField  =   new  TextField();
lbl.selectable 
=  selectable;
lbl.defaultTextFormat 
=  format;
if (autoSize){
lbl.autoSize 
=  TextFieldAutoSize.LEFT;
}
if  (isHand) lbl.htmlText  =   " <a href="http://archive.cnblogs.com/" target="_blank" rel="nofflow">" + label + "</a>";
else lbl.text = label;
return lbl;
}

private 
function getTextFormat(color:uint=0x000000,size:uint = 16,bold:Boolean=false,underline:Boolean=false): 
TextFormat {
var format:TextFormat = new TextFormat();
format.font 
= "宋体";
format.color 
= color;
if(underline)format.underline = true;
format.size 
= size;
format.bold 
= bold;
return format;
}

private 
function getTextFormatWithUnderline(color:uint=0x000000,size:uint = 16,bold:Boolean=false): 
TextFormat {
var format:TextFormat = new TextFormat();
format.font 
= "宋体";
format.color 
= color;
format.underline 
= true;
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 - 22); 
}

private 
function debug(message:String):void {
_state_txt.text 
= message;
}
}

}

可很明显看到,源码是AS3编写的,IDE选择使用FlashDevelop,开源软件
环境:Flash CS4、net framework 2.、Flex SDK4.0、Java SDK 1.6、FlashDevelop


关键点:
1.获取外部参数通过stage.loaderInfo.parameter["Name"]
2.外部JS执行AS内部方法通过ExternalInterface.addCallback("outerEvent", outerEventCallback)
3.AS内部回调外部JS函数通过ExternalInterface.call("outerFunc", "arguments");



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值