Thursday, February 15, 2007

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>
<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>
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)
<cfsetting enablecfoutputonly="true" showdebugoutput="No">
<cfheader name="Content-Disposition"
value="attachment; filename=export.xml"/>
<cfcontent type="xml/text" reset="true"/>
<cfscript>
WriteOutput(session.exportData);
</cfscript>
<cfexit />
Step 4. In flex declare the remote object that will call the cfc:
 <mx:RemoteObject 
id="exportManager"
destination="ColdFusion"
source="com.sample.utils.Export"
showBusyCursor="true">
<mx:method name="toXml" result="login_result(event)" fault="serverFault(event)" />
</mx:RemoteObject>
Step 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:
private function test():void{
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");
}
}
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!

5 comments:

Nathan Drury said...

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!

jones said...

Nice blog...
visit also coldfusion example

jones said...

Nice blog...
visit also coldfusion example

Logeshkumar P said...

very very nice dude! different thinking is identified seperately...

Thanks.
Logeshkumar P.
India

Andreas said...

very nice blog.. keep up the good work!!