Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传

         前几天一位朋友问我一个问题,他说:“我用HTTP接口或是WebService接口可以实现图片上传功能,那么用FluorineFx如何实现图片上传功能呢?”,其实仔细看官方文档和示例程序的自己都可以找到答案,实现上传可以有很多种实现,这里我以官方所提供是示例为基础稍加改动,通过ByteArray类实现图片上传。
 
      首先建立FluorineFx库和网站,在远程服务器类里添加一个处理文件上传的方法,详细代码如下:
namespace ByteStream.Services
{
    [RemotingService]
    
public class ByteStreamService
    {
        
public ByteArray UploadImage(ByteArray ba)
        {
            MemoryStream ms 
= new MemoryStream(ba.GetBuffer());
            Image img 
= Bitmap.FromStream(ms);

            Bitmap newImage 
= new Bitmap(img);

            MemoryStream tempStream 
= new MemoryStream();
            newImage.Save(tempStream, System.Drawing.Imaging.ImageFormat.Png);
            
string path = HttpContext.Current.Server.MapPath("UpLoad/ByteArray.png");
            FileStream fs 
= new FileStream(path, FileMode.Create);
            tempStream.WriteTo(fs);
            fs.Close();

            ByteArray result 
= new ByteArray(tempStream);
            
return result;
        }
    }
}
 
      处理图片上传的方法通过把flex客户端传递来的字节数组包装为内存流,然后通过写文件的形式将图片保存到指定的目录下。示例中提供了一个画图板,用户可以通过选择颜色自画不同的图象,然后保存到服务器上指定的目录。画图板的实现是根据鼠标按下的移动路线做的,代码如下:
private function doMouseDown():void
{
    x1 
= myCanvas.mouseX;
    y1 
= myCanvas.mouseY;
    isDrawing 
= true;
}
private function doMouseMove():void
{
    x2 
= myCanvas.mouseX;
    y2 
= myCanvas.mouseY;
    
if (isDrawing)
    {
        myCanvas.graphics.lineStyle(
2, drawColor);
        myCanvas.graphics.moveTo(x1, y1);
        myCanvas.graphics.lineTo(x2, y2);
        x1 
= x2;
        y1 
= y2;
    }
}
private function doMouseUp():void
{
    isDrawing 
= false;
}
//清空画图板
private function onErase(event:MouseEvent):void
{
    myCanvas.graphics.clear();
}
      
      在官方实例中是使用的RemoteObject实现的,这里我将其修改为通过编程实现AMF通信实现当程序初始化的时候就建立与FluorineFx网关的AMF通信连接:
private var nc:NetConnection;
private var rs:Responder;
private function init():void
{
    rs 
= new Responder(onResult,onFault);
    nc 
= new NetConnection();
    nc.connect(
"http://localhost:2453/FluorineFxWeb/Gateway.aspx")
    nc.client 
= this;
}
 
      在Flex客户端通过当前网络连接的call()方法实现远程方法调用,并指定通过Responder来处理服务器端方法的返回结果。
private function onSaveImage(event:MouseEvent):void
{
    var bd:BitmapData 
= new BitmapData(myCanvas.width,myCanvas.height);
    bd.draw(myCanvas);
    var ba:ByteArray 
= new PNGEncoder().encode(bd);
    nc.call(
"ByteStream.Services.ByteStreamService.UploadImage",rs,ba);
}
 
小提示      在进行Flex开发中,能够通过编程实现的最好通过编程实现,尽量少的去使用Flex组件,这样可以有效的给Flex程序瘦身。
 
      服务器端将传递过去的ByteArray数据返回到了客户端,客户端接收到这些数据通过处理将字节数组转化为显示对象后显示到界面上。
private function onResult(result:ByteArray):void
{
    var loader:Loader 
= new Loader();
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE,loaderCompleteHandler);
    loader.loadBytes(result);
}
private function loaderCompleteHandler(event:Event):void
{
    var loader:Loader 
= (event.target as LoaderInfo).loader;
    loader.contentLoaderInfo.removeEventListener(Event.COMPLETE,loaderCompleteHandler);
    var pictureHolder:UIComponent 
= new UIComponent();
    pictureHolder.addChild(loader);
    
this.resultImage.width = myCanvas.width;
    
this.resultImage.height = myCanvas.height;
    
this.resultImage.addChild(pictureHolder);
}

private function onFault(event:Object):void
{}
 
      到此就完成了图片上传功能,下面是完整的Flex客户端代码:
<?xml version="1.0" encoding="utf-8"?>
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" fontSize="12" creationComplete="init()">
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传    
<mx:Script>
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传        
<![CDATA[
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            import mx.core.UIComponent;
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            import mx.controls.Alert;
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            import mx.events.ResizeEvent;
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            import mx.graphics.codec.PNGEncoder;
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            import mx.rpc.events.FaultEvent;
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            import mx.rpc.events.ResultEvent;
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            
private var isDrawing:Boolean=false;
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            
private var x1:int;
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            
private var y1:int;
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            
private var x2:int;
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            
private var y2:int;
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            
private var drawColor:uint;
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            
private var nc:NetConnection;
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            
private var rs:Responder;
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            
private function init():void
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            
{
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传                rs 
= new Responder(onResult,onFault);
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传                nc 
= new NetConnection();
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传                nc.connect(
"http://localhost:2453/FluorineFxWeb/Gateway.aspx")
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传                nc.client 
= this;
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            }

Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            
private function onSaveImage(event:MouseEvent):void
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            
{
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传                var bd:BitmapData 
= new BitmapData(myCanvas.width,myCanvas.height);
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传                bd.draw(myCanvas);
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传                var ba:ByteArray 
= new PNGEncoder().encode(bd);
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传                nc.call(
"ByteStream.Services.ByteStreamService.UploadImage",rs,ba);
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            }

Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            
private function onResult(result:ByteArray):void
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            
{
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传                var loader:Loader 
= new Loader();
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传                loader.contentLoaderInfo.addEventListener(Event.COMPLETE,loaderCompleteHandler);
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传                loader.loadBytes(result);
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            }

Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            
private function loaderCompleteHandler(event:Event):void
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            
{
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传                var loader:Loader 
= (event.target as LoaderInfo).loader;
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传                loader.contentLoaderInfo.removeEventListener(Event.COMPLETE,loaderCompleteHandler);
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传                var pictureHolder:UIComponent 
= new UIComponent();
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传                pictureHolder.addChild(loader);
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传                
this.resultImage.width = myCanvas.width;
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传                
this.resultImage.height = myCanvas.height;
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传                
this.resultImage.addChild(pictureHolder);
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            }

Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            
private function onFault(event:Object):void
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            
{}
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            
private function doMouseDown():void
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            
{
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传                x1 
= myCanvas.mouseX;
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传                y1 
= myCanvas.mouseY;
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传                isDrawing 
= true;
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            }

Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            
private function doMouseMove():void
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            
{
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传                x2 
= myCanvas.mouseX;
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传                y2 
= myCanvas.mouseY;
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传                
if (isDrawing)
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传                
{
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传                    myCanvas.graphics.lineStyle(
2, drawColor);
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传                    myCanvas.graphics.moveTo(x1, y1);
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传                    myCanvas.graphics.lineTo(x2, y2);
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传                    x1 
= x2;
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传                    y1 
= y2;
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传                }

Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            }

Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            
private function doMouseUp():void
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            
{
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传                isDrawing 
= false;
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            }

Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            
//清空画图板
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传
            private function onErase(event:MouseEvent):void
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            
{
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传                myCanvas.graphics.clear();
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            }

Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传        ]]
>
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传    
</mx:Script>
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传    
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传    
<mx:Panel x="10" y="10" width="348" height="306" layout="absolute">
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传        
<mx:Canvas x="10" y="10" width="315" height="210" id="myCanvas"
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            mouseDown
="doMouseDown()"
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            mouseMove
="doMouseMove()"
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            mouseUp
="doMouseUp()">
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传        
</mx:Canvas>
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传        
<mx:ControlBar>
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            
<mx:ColorPicker change="drawColor = event.target.selectedColor"/>
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            
<mx:Button label="清除" click="onErase(event)"/>
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传            
<mx:Button label="保 存" click="onSaveImage(event)"/>
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传        
</mx:ControlBar>
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传    
</mx:Panel>
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传    
<mx:Image x="382" y="10" id="resultImage"/>
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传
</mx:Application>
Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传
 




本文转自 beniao 51CTO博客,原文链接:http://blog.51cto.com/beniao/166806,如需转载请自行联系原作者