Export Data from Flex App using Coldfusion
It's been a while since I blogged, just so amazingly busy these days that I barely have time to breathe, let alone blog. I'm currently up to my neck in building a flex app that uses Coldfusion 7.02 and DB2 v8/9 on the back end. I've never used Coldfusion before so it's been one hell of a time. I managed to figure something out today that I think is definitely worth sharing. In the app I was required to find a way for users to 'export' or 'save' their work to their drive, in a format they could easily open directly. That eliminated shared objects and I wasn't allowed to use a third party tool like swfStudio to build a helper app and use Localconnection to get the job done (can't wait for Apollo!)
I don't have much time so I'm going to just paste code and explain a bit.
Step 1. Enable session management in the CF app. Create an Application.cfm file in the root of your CF application, put this in it:
<CFAPPLICATION NAME="Name" SESSIONMANAGEMENT="Yes">Step 2. Create a CFC that takes whatever data you wish to save and sticks it in a session variable, return a boolean to let Flex now this worked(Export.cfc):
<cfcomponent>Step 3. Create a CFM file in the application root that will grab the session variable and output it to http, while flagging it as an attachment (this causes nice save as popup to appear). In my example I'm creating an xml file and I ran into issues with whitespace, hence the cfsetting.. this fixed the problem for me (getFile.cfm)
<cffunction name="toXml" access="remote" returntype="boolean" output="true">
<cfargument name="data" type="string" required="yes" default="" />
<cfset session.exportData = #arguments.data#>
<cflog text="data to be exported: #session.exportData#"/>
<cfreturn true>
</cffunction>
</cfcomponent>
<cfsetting enablecfoutputonly="true" showdebugoutput="No">Step 4. In flex declare the remote object that will call the cfc:
<cfheader name="Content-Disposition"
value="attachment; filename=export.xml"/>
<cfcontent type="xml/text" reset="true"/>
<cfscript>
WriteOutput(session.exportData);
</cfscript>
<cfexit />
<mx:RemoteObjectStep 5. Add your code to call it and handle the result. The result, on success, will make an httpservice call to the CFM you created:
id="exportManager"
destination="ColdFusion"
source="com.sample.utils.Export"
showBusyCursor="true">
<mx:method name="toXml" result="login_result(event)" fault="serverFault(event)" />
</mx:RemoteObject>
private function test():void{Conclusion. Basically that's it. I had issues with the session not persisting from setting the variable to getting it, but adding the application.cfm fixed that. I can now push any xml data to the browser for saving. There's lots of other possibilities here as well, such as exporting to Excel or Word, but there's other articles out there that you can google which explain how to do those specific tasks in Coldfusion. Hope this helps!
exportManager.toXml("" +
"" + ");
"The application has successfully exported this file " +
"Eventually the actual data will be passed into this function " +
"
}
private function login_result(event:ResultEvent):void{
if(event.result == "true"){
var request:URLRequest = new URLRequest("getFile.cfm");
flash.net.navigateToURL(request, "_self");
}
}
3 comments:
Nice stuff Vic. Impressive for a CF newbie :) Didn't know about that the attachment header causes a pop up - very cool. Just one suggestion - I think a structDelete(session, "exportData") before the <cfexit /> in getFile.cfm woudl be good to purge the file data from memory, otherwise you may run into memory issues at some point if everyone is exporting files.
Keep up the good work!
very very nice dude! different thinking is identified seperately...
Thanks.
Logeshkumar P.
India
very nice blog.. keep up the good work!!
Post a Comment