`
isiqi
  • 浏览: 16483313 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

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

阅读更多

前几天一位朋友问我一个问题,他说:“我用HTTP接口或是WebService接口可以实现图片上传功能,那么用FluorineFx如何实现图片上传功能呢?”,其实仔细看官方文档和示例程序的自己都可以找到答案,实现上传可以有很多种实现,这里我以官方所提供是示例为基础稍加改动,通过ByteArray类实现图片上传。

首先建立FluorineFx库和网站,在远程服务器类里添加一个处理文件上传的方法,详细代码如下:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->namespaceByteStream.Services
{
[RemotingService]
publicclassByteStreamService
{
publicByteArrayUploadImage(ByteArrayba)
{
MemoryStreamms
=newMemoryStream(ba.GetBuffer());
Imageimg
=Bitmap.FromStream(ms);

BitmapnewImage
=newBitmap(img);

MemoryStreamtempStream
=newMemoryStream();
newImage.Save(tempStream,System.Drawing.Imaging.ImageFormat.Png);
stringpath=HttpContext.Current.Server.MapPath("UpLoad/ByteArray.png");
FileStreamfs
=newFileStream(path,FileMode.Create);
tempStream.WriteTo(fs);
fs.Close();

ByteArrayresult
=newByteArray(tempStream);
returnresult;
}
}
}

处理图片上传的方法通过把flex客户端传递来的字节数组包装为内存流,然后通过写文件的形式将图片保存到指定的目录下。示例中提供了一个画图板,用户可以通过选择颜色自画不同的图象,然后保存到服务器上指定的目录。画图板的实现是根据鼠标按下的移动路线做的,代码如下:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->privatefunctiondoMouseDown():void
{
x1
=myCanvas.mouseX;
y1
=myCanvas.mouseY;
isDrawing
=true;
}
privatefunctiondoMouseMove():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;
}
}
privatefunctiondoMouseUp():void
{
isDrawing
=false;
}
//清空画图板
privatefunctiononErase(event:MouseEvent):void
{
myCanvas.graphics.clear();
}

在官方实例中是使用的RemoteObject实现的,这里我将其修改为通过编程实现AMF通信实现当程序初始化的时候就建立与FluorineFx网关的AMF通信连接:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->privatevarnc:NetConnection;
privatevarrs:Responder;
privatefunctioninit():void
{
rs
=newResponder(onResult,onFault);
nc
=newNetConnection();
nc.connect(
"http://localhost:2453/FluorineFxWeb/Gateway.aspx")
nc.client
=this;
}

在Flex客户端通过当前网络连接的call()方法实现远程方法调用,并指定通过Responder来处理服务器端方法的返回结果。

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->privatefunctiononSaveImage(event:MouseEvent):void
{
varbd:BitmapData
=newBitmapData(myCanvas.width,myCanvas.height);
bd.draw(myCanvas);
varba:ByteArray
=newPNGEncoder().encode(bd);
nc.call(
"ByteStream.Services.ByteStreamService.UploadImage",rs,ba);
}
小提示 在进行Flex开发中,能够通过编程实现的最好通过编程实现,尽量少的去使用Flex组件,这样可以有效的给Flex程序瘦身。

服务器端将传递过去的ByteArray数据返回到了客户端,客户端接收到这些数据通过处理将字节数组转化为显示对象后显示到界面上。

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->privatefunctiononResult(result:ByteArray):void
{
varloader:Loader
=newLoader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,loaderCompleteHandler);
loader.loadBytes(result);
}
privatefunctionloaderCompleteHandler(event:Event):void
{
varloader:Loader
=(event.targetasLoaderInfo).loader;
loader.contentLoaderInfo.removeEventListener(Event.COMPLETE,loaderCompleteHandler);
varpictureHolder:UIComponent
=newUIComponent();
pictureHolder.addChild(loader);
this.resultImage.width=myCanvas.width;
this.resultImage.height=myCanvas.height;
this.resultImage.addChild(pictureHolder);
}

privatefunctiononFault(event:Object):void
{}

到此就完成了图片上传功能,下面是完整的Flex客户端代码:

Flex端完整代码
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><?xmlversion="1.0"encoding="utf-8"?>
<mx:Applicationxmlns:mx="http://www.adobe.com/2006/mxml"layout="absolute"fontSize="12"creationComplete="init()">
<mx:Script>
<![CDATA[
importmx.core.UIComponent;
importmx.controls.Alert;
importmx.events.ResizeEvent;
importmx.graphics.codec.PNGEncoder;
importmx.rpc.events.FaultEvent;
importmx.rpc.events.ResultEvent;

privatevarisDrawing:Boolean=false;
privatevarx1:int;
privatevary1:int;
privatevarx2:int;
privatevary2:int;
privatevardrawColor:uint;

privatevarnc:NetConnection;
privatevarrs:Responder;
privatefunctioninit():void
{
rs
=newResponder(onResult,onFault);
nc
=newNetConnection();
nc.connect(
"http://localhost:2453/FluorineFxWeb/Gateway.aspx")
nc.client
=this;
}


privatefunctiononSaveImage(event:MouseEvent):void
{
varbd:BitmapData
=newBitmapData(myCanvas.width,myCanvas.height);
bd.draw(myCanvas);
varba:ByteArray
=newPNGEncoder().encode(bd);
nc.call(
"ByteStream.Services.ByteStreamService.UploadImage",rs,ba);
}


privatefunctiononResult(result:ByteArray):void
{
varloader:Loader
=newLoader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,loaderCompleteHandler);
loader.loadBytes(result);
}

privatefunctionloaderCompleteHandler(event:Event):void
{
varloader:Loader
=(event.targetasLoaderInfo).loader;
loader.contentLoaderInfo.removeEventListener(Event.COMPLETE,loaderCompleteHandler);
varpictureHolder:UIComponent
=newUIComponent();
pictureHolder.addChild(loader);
this.resultImage.width=myCanvas.width;
this.resultImage.height=myCanvas.height;
this.resultImage.addChild(pictureHolder);
}


privatefunctiononFault(event:Object):void
{}

privatefunctiondoMouseDown():void
{
x1
=myCanvas.mouseX;
y1
=myCanvas.mouseY;
isDrawing
=true;
}

privatefunctiondoMouseMove():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;
}

}

privatefunctiondoMouseUp():void
{
isDrawing
=false;
}

//清空画图板
privatefunctiononErase(event:MouseEvent):void
{
myCanvas.graphics.clear();
}

]]
>
</mx:Script>

<mx:Panelx="10"y="10"width="348"height="306"layout="absolute">
<mx:Canvasx="10"y="10"width="315"height="210"id="myCanvas"
mouseDown
="doMouseDown()"
mouseMove
="doMouseMove()"
mouseUp
="doMouseUp()">
</mx:Canvas>
<mx:ControlBar>
<mx:ColorPickerchange="drawColor=event.target.selectedColor"/>
<mx:Buttonlabel="清除"click="onErase(event)"/>
<mx:Buttonlabel="保存"click="onSaveImage(event)"/>
</mx:ControlBar>
</mx:Panel>
<mx:Imagex="382"y="10"id="resultImage"/>
</mx:Application>


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

分享到:
评论

相关推荐

    FluorineFx中的字节数组实现图片上传

    在Flex与.NET交互的技术栈中,FluorineFx是一个重要的角色,它作为一个开源的AMF(Action Message Format)服务器库,使得Flash/Flex客户端能够与.NET后端无缝通信。在处理图片上传这类数据量较大的操作时,...

    fluorineFx实现Flex与.NET交互实例代码

    本实例代码涵盖了Flex与.NET互操作的多个方面,包括虚拟角色(fluorineFxVR)、服务对象(fluorineFxSO)、服务器RPC(fluorineFxServerRPC)以及聊天应用(fluorineFxChat)。以下是这些关键知识点的详细解释: 1....

    Flex与.NET互操作(八) 使用FluorineFx网关实现远程访问

    在探讨Flex与.NET互操作的系列文章中,本篇文章主要围绕如何使用FluorineFx网关实现远程访问展开。FluorineFx是一个开源的.NET Remoting与Flash Remoting网关,它允许.NET应用程序和Adobe Flex应用程序之间进行远程...

    Flex与.NET互操作(十一):FluorineFx.Net的及时通信应用(Remote Procedure Call)(二)

    Flex与.NET互操作系列文章的第十一部分主要探讨了FluorineFx.NET框架下的远程过程调用(RPC)机制,这是一种实现客户端(Flash或Flex)与服务器端(.NET)高效通信的方法。FluorineFx.NET为跨平台交互提供了强大的...

    Flex与.NET互操作(十):FluorineFx.Net的及时通信应用(ApplicationAdapter)(一)

    ***是基于.NET平台的一个开源框架,用于实现实时通信(real-time communication)应用,尤其在Flash/Flex客户端与.NET服务端之间的通信。它允许开发者构建基于RTMP(Real Time Messaging Protocol)或AMF(Action ...

    Flex与.NET互操作(十二):FluorineFx.Net的及时通信应用(Remote Shared Objects)(三)

    Flex与.NET互操作的核心在于 FluorineFx.Net 框架,它允许 Flex 客户端与 .NET 服务端进行高效的数据交换。本篇主要关注的是 Remote Shared Objects(远程共享对象),这是一个强大的功能,用于在多客户端之间实现...

    flex与.net通信的FluorineFx模板

    Flex与.NET通信的FluorineFx模板是一个关键的技术实现,它使得基于Adobe Flex的前端应用能够有效地与后端的.NET Framework服务进行交互。FluorineFx是这个过程中的核心工具,它是一个开放源码的库,专门设计用于解决...

    Flex与.NET互操作(十三):FluorineFx.Net实现视频录制与视频回放

    在本文中,我们将深入探讨如何利用FluorineFx.Net框架来实现视频录制与回放功能。FluorineFx.Net是一个强大的工具,它不仅提供了AMF(Action Message Format)通信、RTMP(Real-Time Messaging Protocol)协议、RPC...

    Flex与ASP.net交互

    【Flex与ASP.NET交互】指的是在开发Web应用时,使用Adobe Flex前端技术和Microsoft ASP.NET后端技术进行数据通信的方式。Flex是一种用于构建富互联网应用程序(RIA)的开发框架,而ASP.NET是.NET Framework的一部分...

    Flex与.NET交互

    在Flex与.NET的交互中,FluorineFx是一个重要的第三方库,它作为一个AMF(Action Message Format)服务器端代理,实现了Flex客户端与.NET服务之间的无缝通信。AMF是一种二进制数据格式,用于提高数据传输效率,降低...

    Flex与ASP.Net通信(FluorineFx)程序例子

    Flex与ASP.NET之间的通信是构建富互联网应用程序(RIA)时常用的一种技术,它允许前端的Flex界面与后端的ASP.NET服务进行数据交互。在这个程序例子中,我们使用了 FluorineFx 框架来实现这种通信。FluorineFx 是一个...

    Flex 4 asp.net VS2010 FluorineFX

    在本教程中,我们将探讨如何使用Visual Studio 2010(VS2010)作为集成开发环境(IDE),结合FluorineFX这一开源的Adobe Flex到.NET的AMF Remoting框架,来实现Flex前端与ASP.NET后端的无缝通信。 首先,Flex 4是...

    Flex(Flash)与.net交互教程

    Flex(Flash)与.NET交互教程主要讲解了如何在Flex(基于Flash技术的RIA开发工具)和.NET框架之间建立通信,实现客户端与服务器端的数据交换。本文将深入介绍这个过程,包括必要的软件安装、项目的创建以及代码实现...

    fluorinefx与asp.net结合flex连接数据库

    FluorineFX 是一款强大的 .NET 与 Adobe Flex 之间的集成框架,它允许开发者使用 Flex 客户端与 ASP.NET 服务器端进行交互,实现数据的动态交换和远程调用服务(RPC)。在这个示例中,我们将探讨如何利用 FluorineFX...

    跟我一步步搭建 Flex+FluorineFx+ASP.NET

    FluorineFx是.NET平台上的一个开源AMF(Action Message Format)实现,它使得Flex与ASP.NET之间能够进行高效的数据交换;而ASP.NET则是微软的Web应用程序框架,用于构建后端服务器逻辑。 **一、安装软件与配置** 1...

    Flex_FluorineFx_ASP.NET

    4. 结合应用:在Flex_FluorineFx_ASP.NET的项目中,开发者通常会用Flex创建用户界面,通过FluorineFx实现Flex与ASP.NET之间的数据交互。例如,Flex客户端可以发送AMF请求到ASP.NET服务器,获取或更新数据,而服务器...

Global site tag (gtag.js) - Google Analytics