Merb on Air fix for Flex Beta 3
snipped by vixiom
Here's the fix to make the air side of things work with Flex Beta 3 (http://blog.vixiom.com/2007/06/29/merb-on-air-drag-and-drop-multiple-file-upload/)
package com.vixiom.merb_air_upload { import com.vixiom.merb_air_upload.UploadProgressComponent import mx.core.WindowedApplication; import mx.containers.VBox; import mx.controls.Button; import mx.events.FlexEvent; import flash.events.*; import flash.desktop.*; import flash.filesystem.File; import flash.net.*; import mx.managers.DragManager; public class App extends WindowedApplication { private var filesToUpload :Array private var UploadProgressComponents :Array; public var files_vb:VBox; public var upload_btn:Button; private var uploadURL:URLRequest; /* * Constructor */ public function App() :void { addEventListener( FlexEvent.CREATION_COMPLETE, creationCompleteHandler ); } /* * creationComplete * * called when the AIR has finishe loading, sets up drag/drop event listeners reference objects * */ private function creationCompleteHandler( event:FlexEvent ) :void { addEventListener( NativeDragEvent.NATIVE_DRAG_ENTER, onDragEnter ); addEventListener( NativeDragEvent.NATIVE_DRAG_DROP, onDragDrop ); upload_btn.enabled = false; upload_btn.addEventListener( MouseEvent.CLICK, upload ); uploadURL = new URLRequest(); uploadURL.url = "http://localhost:4000/upload"; uploadURL.method=URLRequestMethod.POST; filesToUpload = new Array(); UploadProgressComponents = new Array(); } /* * onDragEnter * * files have been dragged into the app */ private function onDragEnter( event:NativeDragEvent ) :void { DragManager.acceptDragDrop(this); } /* * onDragDrop * * when files are dropped... */ private function onDragDrop( event:NativeDragEvent ) :void { NativeDragManager.dropAction = NativeDragActions.COPY; var files:Array = event.clipboard.getData(ClipboardFormats.FILE_LIST_FORMAT) as Array; for each (var f:File in files) { addFile( FileReference( f ) ); } upload_btn.enabled = true; } /* * addFile * * ...add then to filesToUpload array, and the file upload listeners, * and create a progress component for each file */ private function addFile( f:FileReference ) :void { filesToUpload.push( f ); var upv:UploadProgressComponent = new UploadProgressComponent(); UploadProgressComponents.push( upv ); files_vb.addChild( upv ); upv.file_lb.text = f.name; upv.pb.source = f; f.addEventListener( Event.COMPLETE, completeHandler ); f.addEventListener( IOErrorEvent.IO_ERROR, ioErrorHandler ); } /* * completeHandler * * a file upload is complete, remove it from filesToUpload * and remove the upload component */ private function completeHandler( e:Event ) :void { var f:FileReference = FileReference(e.target); for( var i:uint; i < filesToUpload.length; i++ ) { if( f.name == filesToUpload[i].name ) { files_vb.removeChild( UploadProgressComponents[i] ); filesToUpload.splice(i, 1); UploadProgressComponents.splice(i, 1); } } } /* * trace any errors */ private function ioErrorHandler( event:IOErrorEvent ) :void { trace("ioErrorHandler: " + event); } /* * upload! */ private function upload( e:MouseEvent ) :void { for each (var f:File in filesToUpload) { f.upload( uploadURL ); } } } }




