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客户端代码:


ContractedBlock.gif ExpandedBlockStart.gif Flex端完整代码
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" fontSize="12" creationComplete="init()">
    
<mx:Script>
        
<![CDATA[
            import mx.core.UIComponent;
            import mx.controls.Alert;
            import mx.events.ResizeEvent;
            import mx.graphics.codec.PNGEncoder;
            import mx.rpc.events.FaultEvent;
            import mx.rpc.events.ResultEvent;
            
            
private var isDrawing:Boolean=false;
            
private var x1:int;
            
private var y1:int;
            
private var x2:int;
            
private var y2:int;
            
private var drawColor:uint;
            
            
private var nc:NetConnection;
            
private var rs:Responder;
            
private function init():void
ExpandedBlockStart.gifContractedBlock.gif            
{
                rs 
= new Responder(onResult,onFault);
                nc 
= new NetConnection();
                nc.connect(
"http://localhost:2453/FluorineFxWeb/Gateway.aspx")
                nc.client 
= this;
            }

            
            
private function onSaveImage(event:MouseEvent):void
ExpandedBlockStart.gifContractedBlock.gif            
{
                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);
            }

            
            
private function onResult(result:ByteArray):void
ExpandedBlockStart.gifContractedBlock.gif            
{
                var loader:Loader 
= new Loader();
                loader.contentLoaderInfo.addEventListener(Event.COMPLETE,loaderCompleteHandler);
                loader.loadBytes(result);
            }

            
private function loaderCompleteHandler(event:Event):void
ExpandedBlockStart.gifContractedBlock.gif            
{
                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
ExpandedBlockStart.gifContractedBlock.gif            
{}
            
            
private function doMouseDown():void
ExpandedBlockStart.gifContractedBlock.gif            
{
                x1 
= myCanvas.mouseX;
                y1 
= myCanvas.mouseY;
                isDrawing 
= true;
            }

            
private function doMouseMove():void
ExpandedBlockStart.gifContractedBlock.gif            
{
                x2 
= myCanvas.mouseX;
                y2 
= myCanvas.mouseY;
                
if (isDrawing)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    myCanvas.graphics.lineStyle(
2, drawColor);
                    myCanvas.graphics.moveTo(x1, y1);
                    myCanvas.graphics.lineTo(x2, y2);
                    x1 
= x2;
                    y1 
= y2;
                }

            }

            
private function doMouseUp():void
ExpandedBlockStart.gifContractedBlock.gif            
{
                isDrawing 
= false;
            }

            
//清空画图板
            private function onErase(event:MouseEvent):void
ExpandedBlockStart.gifContractedBlock.gif            
{
                myCanvas.graphics.clear();
            }

        ]]
>
    
</mx:Script>
    
    
<mx:Panel x="10" y="10" width="348" height="306" layout="absolute">
        
<mx:Canvas x="10" y="10" width="315" height="210" id="myCanvas"
            mouseDown
="doMouseDown()"
            mouseMove
="doMouseMove()"
            mouseUp
="doMouseUp()">
        
</mx:Canvas>
        
<mx:ControlBar>
            
<mx:ColorPicker change="drawColor = event.target.selectedColor"/>
            
<mx:Button label="清除" click="onErase(event)"/>
            
<mx:Button label="保 存" click="onSaveImage(event)"/>
        
</mx:ControlBar>
    
</mx:Panel>
    
<mx:Image x="382" y="10" id="resultImage"/>
</mx:Application>


 

      本文示例程序下载:ByteStreamDemo.rar

版权说明

  本文属原创文章,欢迎转载,其版权归作者和博客园共有。  

  作      者:Beniao

 文章出处:http://beniao.cnblogs.com/  或  http://www.cnblogs.com/

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值