<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Alastair&#039;s Axioms &#187; Merb</title>
	<atom:link href="http://blog.alastairdawson.com/category/merb/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.alastairdawson.com</link>
	<description>Flex, Ruby, etc. etc.</description>
	<lastBuildDate>Thu, 11 Feb 2010 19:28:16 +0000</lastBuildDate>
	
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Interesting Links: YUIRails, Ebb faster than Mongrel and thin</title>
		<link>http://blog.alastairdawson.com/2008/03/05/interesting-links-yuirails-ebb-faster-than-mongrel-and-thin/</link>
		<comments>http://blog.alastairdawson.com/2008/03/05/interesting-links-yuirails-ebb-faster-than-mongrel-and-thin/#comments</comments>
		<pubDate>Wed, 05 Mar 2008 15:23:42 +0000</pubDate>
		<dc:creator>Alastair</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Merb]]></category>
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://blog.vixiom.com/2008/03/05/interesting-links-yuirails-ebb-faster-than-mongrel-and-thin/</guid>
		<description><![CDATA[The JavaScript library I use most after prototype is YUI so a big thanks to Chetan Patil for making it much easier to use in Rails.
Ruby Inside has a post on Ebb a small and fast web server for hosting Rails and Merb applications (and soon Django).
Ebb is a small, extremely high performance Web / [...]]]></description>
			<content:encoded><![CDATA[<p>The JavaScript library I use most after prototype is <a href="http://developer.yahoo.com/yui/">YUI</a> so a big thanks to <a href="http://justbarebones.blogspot.com/2008/01/announcing-yuirails.html">Chetan Patil</a> for making it much easier to use in Rails.</p>
<p>Ruby Inside <a href="http://www.rubyinside.com/ebb-web-framework-http-server-786.html">has a post</a> on <a href="http://ebb.rubyforge.org/">Ebb</a> a small and fast web server for hosting Rails and Merb applications (and soon Django).</p>
<blockquote><p>Ebb is a small, extremely high performance Web / HTTP server designed specifically for hosting applications built upon Web frameworks such as Rails and Merb (and, in future, apps on other non-Ruby frameworks.) The design is event based (similar to that used by Ruby daemons that use EventMachine) but Ebb itself is written in C and dispatches requests to Rack adapters. This is a real leapfrog over the popular Mongrel and Thin daemons which are primarily written in Ruby, and results in scary levels of performance.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.alastairdawson.com/2008/03/05/interesting-links-yuirails-ebb-faster-than-mongrel-and-thin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Merbivore</title>
		<link>http://blog.alastairdawson.com/2007/11/07/merbivore/</link>
		<comments>http://blog.alastairdawson.com/2007/11/07/merbivore/#comments</comments>
		<pubDate>Wed, 07 Nov 2007 22:17:41 +0000</pubDate>
		<dc:creator>Alastair</dc:creator>
				<category><![CDATA[Merb]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://blog.vixiom.com/2007/11/07/merbivore/</guid>
		<description><![CDATA[Merb gets a slick new site.
]]></description>
			<content:encoded><![CDATA[<p>Merb gets a slick <a href="http://www.merbivore.com">new site</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alastairdawson.com/2007/11/07/merbivore/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Merb on AIR &#8211; Drag and Drop Multiple File Upload</title>
		<link>http://blog.alastairdawson.com/2007/06/29/merb-on-air-drag-and-drop-multiple-file-upload/</link>
		<comments>http://blog.alastairdawson.com/2007/06/29/merb-on-air-drag-and-drop-multiple-file-upload/#comments</comments>
		<pubDate>Fri, 29 Jun 2007 07:07:38 +0000</pubDate>
		<dc:creator>Alastair</dc:creator>
				<category><![CDATA[AIR]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Merb]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://blog.vixiom.com/2007/06/29/merb-on-air-drag-and-drop-multiple-file-upload/</guid>
		<description><![CDATA[Merb was originally created by Ezra Zygmuntowicz to avoid some Rails upload issues.

This is one of the things that Merb was written for. Rails doesnâ€˜t allow multiple concurrent file uploads at once without blocking an entire rails backend for each file upload. Merb allows multiple file uploads at once.

I&#8217;ve built &#8216;multiple&#8217; file uploaders for Rails [...]]]></description>
			<content:encoded><![CDATA[<p>Merb was originally created by <a href="http://brainspl.at/">Ezra Zygmuntowicz</a> to avoid some Rails upload issues.</p>
<blockquote>
<p>This is one of the things that Merb was written for. Rails doesnâ€˜t allow multiple concurrent file uploads at once without blocking an entire rails backend for each file upload. Merb allows multiple file uploads at once.</p>
</blockquote>
<p>I&#8217;ve built &#8216;multiple&#8217; file uploaders for Rails sites but they always involved some slight of hand, the files appeared to be uploading all at once but they where actually queued up by Flex then handled one by one by the app (which also had the unhappy side effect of blocking any other requests to that process). I&#8217;ve been wanting to try out Adobe AIR&#8217;s file system drag and drop for a while so this is a two-fer example. You&#8217;ll need the beta version of <a href="http://labs.adobe.com/technologies/flex/flexbuilder3/">Flex Builder 3</a> or the <a href="http://labs.adobe.com/technologies/flex/sdk/flex3sdk.html">Flex 3 SDK beta</a> if you don&#8217;t mind getting down with the command line. </p>
<p>In a hurry? Here&#8217;s <a href="http://blog.vixiom.com/uploads/merb_air_upload.zip">one I made earlier</a> (flex source in <span class="meta meta_paragraph meta_paragraph_text">&#8216;dist/app/fx</span>&#8216;).</p>
<p>If you haven&#8217;t before install Merb</p>
<pre class="textmate-source"><span class="text text_plain"><span class="meta meta_paragraph meta_paragraph_text">$ sudo gem install merb</span></span></pre>
<p>Then create a new Merb app</p>
<pre class="textmate-source"><span class="text text_plain"><span class="meta meta_paragraph meta_paragraph_text">$ merb -g merb_air_upload</span></span></pre>
<p>and dive on in</p>
<pre class="textmate-source"><span class="text text_plain"><span class="meta meta_paragraph meta_paragraph_text">$ cd merb_air_upload</span></span></pre>
<p>We&#8217;ll need two folders not in a Merb skeleton, one for Flex, and one for our uploads</p>
<pre class="textmate-source"><span class="text text_plain"><span class="meta meta_paragraph meta_paragraph_text">$ mkdir dist/app/fx
$ mkdir dist/public/uploads</span></span></pre>
<p>Create a local database called &#8216;merb_air_upload&#8217; and edit dist/conf/merb_init.rb so that the database definition matches your setup</p>
<pre class="textmate-source"><span class="source source_ruby source_ruby_rails"><span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> set your db info here
</span><span class="support support_class support_class_ruby">ActiveRecord</span>::<span class="support support_class support_class_ruby">Base</span>.establish_connection(
  <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>adapter</span> =&gt; <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>mysql<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>,
  <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>username</span> =&gt; <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>root<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>,
  <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>password</span> =&gt; <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>,
  <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>database</span> =&gt; <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>merb_air_upload<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>
)</span></pre>
<p>Our model will be called &#8216;UserFile&#8217; as &#8216;Upload&#8217; and &#8216;File&#8217; are reserved words, create a migration</p>
<pre class="textmate-source"><span class="text text_plain"><span class="meta meta_paragraph meta_paragraph_text">$ ./script/new_migration CreateUserFiles</span></span></pre>
<p>and edit it (dist/schema/migrations/002_create_user_files.rb) to look like so</p>
<pre class="textmate-source"><span class="source source_ruby source_ruby_rails"><span class="meta meta_class meta_class_ruby"><span class="keyword keyword_control keyword_control_class keyword_control_class_ruby">class</span> <span class="entity entity_name entity_name_type entity_name_type_class entity_name_type_class_ruby">CreateUserFiles<span class="entity entity_other entity_other_inherited-class entity_other_inherited-class_ruby"> <span class="punctuation punctuation_separator punctuation_separator_inheritance punctuation_separator_inheritance_ruby">&lt;</span> ActiveRecord::Migration</span></span></span>
  <span class="meta meta_function meta_function_method meta_function_method_without-arguments meta_function_method_without-arguments_ruby"><span class="keyword keyword_control keyword_control_def keyword_control_def_ruby">def</span> <span class="entity entity_name entity_name_function entity_name_function_ruby">self.up</span></span>
    create_table <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>user_files</span> <span class="keyword keyword_control keyword_control_ruby keyword_control_ruby_start-block">do </span>|t|
      t.column <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>filename</span>, <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>string</span>, <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>null</span> =&gt; <span class="constant constant_language constant_language_ruby">false</span>
    <span class="keyword keyword_control keyword_control_ruby">end</span>
  <span class="keyword keyword_control keyword_control_ruby">end</span>

  <span class="meta meta_function meta_function_method meta_function_method_without-arguments meta_function_method_without-arguments_ruby"><span class="keyword keyword_control keyword_control_def keyword_control_def_ruby">def</span> <span class="entity entity_name entity_name_function entity_name_function_ruby">self.down</span></span>
    drop_table <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>user_files</span>
  <span class="keyword keyword_control keyword_control_ruby">end</span>
<span class="keyword keyword_control keyword_control_ruby">end</span></span></pre>
<p>rake your db</p>
<pre class="textmate-source"><span class="text text_plain"><span class="meta meta_paragraph meta_paragraph_text">$ rake db:migrate</span></span></pre>
<p>Then create a UserFile model (dist/app/models/user_file.rb)</p>
<pre class="textmate-source"><span class="source source_ruby source_ruby_rails"><span class="meta meta_rails meta_rails_model"><span class="meta meta_class meta_class_ruby"><span class="keyword keyword_control keyword_control_class keyword_control_class_ruby">class</span> <span class="entity entity_name entity_name_type entity_name_type_class entity_name_type_class_ruby">UserFile<span class="entity entity_other entity_other_inherited-class entity_other_inherited-class_ruby"> <span class="punctuation punctuation_separator punctuation_separator_inheritance punctuation_separator_inheritance_ruby">&lt;</span> ActiveRecord::Base</span></span></span>
</span><span class="keyword keyword_control keyword_control_ruby">end</span></span></pre>
<p>and an upload controller (dist/controllers/upload.rb)</p>
<pre class="textmate-source"><span class="source source_ruby source_ruby_rails"><span class="meta meta_class meta_class_ruby"><span class="keyword keyword_control keyword_control_class keyword_control_class_ruby">class</span> <span class="entity entity_name entity_name_type entity_name_type_class entity_name_type_class_ruby">Upload<span class="entity entity_other entity_other_inherited-class entity_other_inherited-class_ruby"> <span class="punctuation punctuation_separator punctuation_separator_inheritance punctuation_separator_inheritance_ruby">&lt;</span> Application</span></span></span>

  <span class="meta meta_function meta_function_method meta_function_method_without-arguments meta_function_method_without-arguments_ruby"><span class="keyword keyword_control keyword_control_def keyword_control_def_ruby">def</span> <span class="entity entity_name entity_name_function entity_name_function_ruby">index</span></span>
<span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby">    <span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> for testing check jer terminal
</span>    puts params.inspect
<span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby">    <span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> new user file object
</span>    <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>upload</span> = <span class="support support_class support_class_ruby">UserFile</span>.<span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby">new</span>
    <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>upload</span>.filename = params[<span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>Filename</span>]
<span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby">    <span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> save
</span>    <span class="keyword keyword_control keyword_control_ruby">if</span> <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>upload</span>.save
<span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby">      <span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> create directories
</span>      dist_root = <span class="support support_class support_class_ruby">Merb</span>::<span class="support support_class support_class_ruby">Server</span>.config[<span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>dist_root</span>]
      <span class="support support_class support_class_ruby">FileUtils</span>.mkdir dist_root + <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>/public/uploads/<span class="source source_ruby source_ruby_embedded source_ruby_embedded_source"><span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">#{</span><span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>upload</span>.id<span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">}</span></span><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>
<span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby">      <span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> move
</span>      destination = dist_root + <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>/public/uploads/<span class="source source_ruby source_ruby_embedded source_ruby_embedded_source"><span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">#{</span><span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>upload</span>.id<span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">}</span></span>/<span class="source source_ruby source_ruby_embedded source_ruby_embedded_source"><span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">#{</span>params[<span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>Filename</span>]<span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">}</span></span><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>
      <span class="support support_class support_class_ruby">FileUtils</span>.mv params[<span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>Filedata</span>][<span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>tempfile</span>].path, destination
    <span class="keyword keyword_control keyword_control_ruby">else</span>
      <span class="constant constant_language constant_language_ruby">false</span>
    <span class="keyword keyword_control keyword_control_ruby">end</span>
<span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby">    <span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span>render_no_layout
</span>  <span class="keyword keyword_control keyword_control_ruby">end</span>

<span class="keyword keyword_control keyword_control_ruby">end</span></span></pre>
<p>That&#8217;s it for the Merb side of thing on to our AIR app, fire up Flex Builder and create a new AIR project</p>
<p><img src="http://blog.vixiom.com/uploads/merb_air_new.png" width="551" height="185"></p>
<p>I like to keep my flex files in my Rails/Merb app directory</p>
<p><img src="http://blog.vixiom.com/uploads/merb_air_dir.png" width="549" height="270"></p>
<p>The AIR app is three files; the main MXML file (dist/app/fx/merb_air_upload.mxml), a code behind class (dist/app/fx/com/vixiom/merb_air_upload/App.as), and an upload progress component that gets repeated for each file (dist/app/fx/com/vixiom/merb_air_upload/UploadProgressComponent.mxml). Here&#8217;s the main MXML file:</p>
<pre class="textmate-source"><span class="source source_mxml"><span class="meta meta_tag meta_tag_preprocessor meta_tag_preprocessor_xml"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_xml">&lt;?</span><span class="entity entity_name entity_name_tag entity_name_tag_xml">xml</span><span class="entity entity_other entity_other_attribute-name entity_other_attribute-name_xml"> version</span>=<span class="string string_quoted string_quoted_double string_quoted_double_xml"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_xml">"</span>1.0<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_xml">"</span></span><span class="entity entity_other entity_other_attribute-name entity_other_attribute-name_xml"> encoding</span>=<span class="string string_quoted string_quoted_double string_quoted_double_xml"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_xml">"</span>utf-8<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_xml">"</span></span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_xml">?&gt;</span></span>
<span class="meta meta_tag meta_tag_xml"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_xml">&lt;</span><span class="entity entity_name entity_name_tag entity_name_tag_namespace entity_name_tag_namespace_xml">app</span><span class="entity entity_name entity_name_tag entity_name_tag_xml"><span class="punctuation punctuation_separator punctuation_separator_namespace punctuation_separator_namespace_xml">:</span></span><span class="entity entity_name entity_name_tag entity_name_tag_localname entity_name_tag_localname_xml">App</span>
    xmlns:mx=<span class="string string_quoted string_quoted_double string_quoted_double_xml"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_xml">"</span>http://www.adobe.com/2006/mxml<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_xml">"</span></span>
    xmlns:app=<span class="string string_quoted string_quoted_double string_quoted_double_xml"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_xml">"</span>com.vixiom.merb_air_upload.*<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_xml">"</span></span>
    layout=<span class="string string_quoted string_quoted_double string_quoted_double_xml"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_xml">"</span>vertical<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_xml">"</span></span>
    width=<span class="string string_quoted string_quoted_double string_quoted_double_xml"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_xml">"</span>300<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_xml">"</span></span> <span class="entity entity_other entity_other_attribute-name entity_other_attribute-name_localname entity_other_attribute-name_localname_xml">height</span>=<span class="string string_quoted string_quoted_double string_quoted_double_xml"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_xml">"</span>375<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_xml">"</span></span>
    backgroundGradientAlphas=<span class="string string_quoted string_quoted_double string_quoted_double_xml"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_xml">"</span>[1.0, 1.0]<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_xml">"</span></span>
    backgroundGradientColors=<span class="string string_quoted string_quoted_double string_quoted_double_xml"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_xml">"</span>[#F4F4F4, #E0E0E0]<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_xml">"</span></span>
    paddingBottom=<span class="string string_quoted string_quoted_double string_quoted_double_xml"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_xml">"</span>10<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_xml">"</span></span> <span class="entity entity_other entity_other_attribute-name entity_other_attribute-name_localname entity_other_attribute-name_localname_xml">paddingLeft</span>=<span class="string string_quoted string_quoted_double string_quoted_double_xml"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_xml">"</span>10<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_xml">"</span></span> <span class="entity entity_other entity_other_attribute-name entity_other_attribute-name_localname entity_other_attribute-name_localname_xml">paddingRight</span>=<span class="string string_quoted string_quoted_double string_quoted_double_xml"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_xml">"</span>10<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_xml">"</span></span> <span class="entity entity_other entity_other_attribute-name entity_other_attribute-name_localname entity_other_attribute-name_localname_xml">paddingTop</span>=<span class="string string_quoted string_quoted_double string_quoted_double_xml"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_xml">"</span>10<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_xml">"</span></span>
    verticalScrollPolicy=<span class="string string_quoted string_quoted_double string_quoted_double_xml"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_xml">"</span>off<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_xml">"</span></span> <span class="entity entity_other entity_other_attribute-name entity_other_attribute-name_localname entity_other_attribute-name_localname_xml">horizontalScrollPolicy</span>=<span class="string string_quoted string_quoted_double string_quoted_double_xml"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_xml">"</span>off<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_xml">"</span></span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_xml">&gt;</span></span>

    <span class="meta meta_tag meta_tag_xml meta_tag_xml_template">&lt;<span class="entity entity_name entity_name_tag entity_name_tag_xml">mx:</span>VBox <span class="keyword keyword_operator keyword_operator_namespace-separator keyword_operator_namespace-separator_xml">id</span>=<span class="string string_quoted string_quoted_double string_quoted_double_xml">"files_vb"</span>
        width=<span class="string string_quoted string_quoted_double string_quoted_double_xml">"100%"</span> <span class="keyword keyword_operator keyword_operator_namespace-separator keyword_operator_namespace-separator_xml">height</span>=<span class="string string_quoted string_quoted_double string_quoted_double_xml">"300"</span>
        backgroundColor=<span class="string string_quoted string_quoted_double string_quoted_double_xml">"#FFFFFF"</span>
        horizontalScrollPolicy=<span class="string string_quoted string_quoted_double string_quoted_double_xml">"off"</span>
        paddingBottom=<span class="string string_quoted string_quoted_double string_quoted_double_xml">"5"</span> <span class="keyword keyword_operator keyword_operator_namespace-separator keyword_operator_namespace-separator_xml">paddingLeft</span>=<span class="string string_quoted string_quoted_double string_quoted_double_xml">"5"</span> <span class="keyword keyword_operator keyword_operator_namespace-separator keyword_operator_namespace-separator_xml">paddingRight</span>=<span class="string string_quoted string_quoted_double string_quoted_double_xml">"5"</span> <span class="keyword keyword_operator keyword_operator_namespace-separator keyword_operator_namespace-separator_xml">paddingTop</span>=<span class="string string_quoted string_quoted_double string_quoted_double_xml">"5"</span> <span class="keyword keyword_operator keyword_operator_namespace-separator keyword_operator_namespace-separator_xml">borderColor</span>=<span class="string string_quoted string_quoted_double string_quoted_double_xml">"#ABABAB"</span> <span class="keyword keyword_operator keyword_operator_namespace-separator keyword_operator_namespace-separator_xml">borderStyle</span>=<span class="string string_quoted string_quoted_double string_quoted_double_xml">"inset"</span>&gt;</span>
    <span class="meta meta_tag meta_tag_xml"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_xml">&lt;/</span><span class="entity entity_name entity_name_tag entity_name_tag_namespace entity_name_tag_namespace_xml">mx</span><span class="entity entity_name entity_name_tag entity_name_tag_xml"><span class="punctuation punctuation_separator punctuation_separator_namespace punctuation_separator_namespace_xml">:</span></span><span class="entity entity_name entity_name_tag entity_name_tag_localname entity_name_tag_localname_xml">VBox</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_xml">&gt;</span></span>

    <span class="meta meta_tag meta_tag_xml meta_tag_xml_template">&lt;<span class="entity entity_name entity_name_tag entity_name_tag_xml">mx:</span>Button <span class="keyword keyword_operator keyword_operator_namespace-separator keyword_operator_namespace-separator_xml">id</span>=<span class="string string_quoted string_quoted_double string_quoted_double_xml">"upload_btn"</span> <span class="keyword keyword_operator keyword_operator_namespace-separator keyword_operator_namespace-separator_xml">label</span>=<span class="string string_quoted string_quoted_double string_quoted_double_xml">"Upload Files"</span>/&gt;</span>

<span class="meta meta_tag meta_tag_xml"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_xml">&lt;/</span><span class="entity entity_name entity_name_tag entity_name_tag_namespace entity_name_tag_namespace_xml">app</span><span class="entity entity_name entity_name_tag entity_name_tag_xml"><span class="punctuation punctuation_separator punctuation_separator_namespace punctuation_separator_namespace_xml">:</span></span><span class="entity entity_name entity_name_tag entity_name_tag_localname entity_name_tag_localname_xml">App</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_xml">&gt;</span></span></span></pre>
<p>It&#8217;s hooked up to it&#8217;s code behind &#8216;App.as&#8217; class by the xmlns tag <span class="meta meta_tag meta_tag_xml">(xmlns:app=<span class="string string_quoted string_quoted_double string_quoted_double_xml"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_xml">&#8220;</span>com.vixiom.merb_air_upload.*<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_xml">&#8220;</span></span></span>) App.as extends WindowedApplication which is the base of all AIR apps:</p>
<pre class="textmate-source"><span class="source source_actionscript">package com.vixiom.merb_air_upload
{
    <span class="keyword keyword_control keyword_control_actionscript">import</span> com.vixiom.merb_air_upload.UploadProgressComponent

    <span class="keyword keyword_control keyword_control_actionscript">import</span> mx.core.WindowedApplication;
    <span class="keyword keyword_control keyword_control_actionscript">import</span> mx.containers.VBox;
    <span class="keyword keyword_control keyword_control_actionscript">import</span> mx.controls.<span class="support support_class support_class_actionscript">Button</span>;

    <span class="keyword keyword_control keyword_control_actionscript">import</span> mx.events.FlexEvent;
    <span class="keyword keyword_control keyword_control_actionscript">import</span> flash.events.<span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">*</span>;

    <span class="keyword keyword_control keyword_control_actionscript">import</span> flash.desktop.<span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">*</span>;
    <span class="keyword keyword_control keyword_control_actionscript">import</span> flash.filesystem.File;
    <span class="keyword keyword_control keyword_control_actionscript">import</span> flash.net.<span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">*</span>;

    <span class="keyword keyword_control keyword_control_actionscript">public</span> <span class="meta meta_class meta_class_actionscript"><span class="storage storage_type storage_type_class storage_type_class_actionscript">class</span> <span class="entity entity_name entity_name_type entity_name_type_class entity_name_type_class_actionscript">App</span> <span class="storage storage_modifier storage_modifier_extends storage_modifier_extends_actionscript">extends</span> <span class="entity entity_other entity_other_inherited-class entity_other_inherited-class_actionscript">WindowedApplication</span></span>
    {
        <span class="keyword keyword_control keyword_control_actionscript">private</span> <span class="keyword keyword_control keyword_control_actionscript">var</span> filesToUpload <span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">:</span><span class="support support_class support_class_actionscript">Array</span>
        <span class="keyword keyword_control keyword_control_actionscript">private</span> <span class="keyword keyword_control keyword_control_actionscript">var</span> UploadProgressComponents <span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">:</span><span class="support support_class support_class_actionscript">Array</span>;
        <span class="keyword keyword_control keyword_control_actionscript">public</span> <span class="keyword keyword_control keyword_control_actionscript">var</span> files_vb<span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">:</span>VBox;
        <span class="keyword keyword_control keyword_control_actionscript">public</span> <span class="keyword keyword_control keyword_control_actionscript">var</span> upload_btn<span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">:</span><span class="support support_class support_class_actionscript">Button</span>;
        <span class="keyword keyword_control keyword_control_actionscript">private</span> <span class="keyword keyword_control keyword_control_actionscript">var</span> uploadURL<span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">:</span>URLRequest;

        <span class="comment comment_block comment_block_actionscript"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_actionscript">/*</span>
         * Constructor
         <span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_actionscript">*/</span></span>
        <span class="keyword keyword_control keyword_control_actionscript">public</span> <span class="meta meta_function meta_function_actionscript"><span class="storage storage_type storage_type_function storage_type_function_asp">function</span> <span class="entity entity_name entity_name_function entity_name_function_asp">App</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_begin punctuation_definition_parameters_begin_actionscript">(</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_end punctuation_definition_parameters_end_actionscript">)</span></span> <span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">:</span><span class="support support_function support_function_actionscript">void</span>
        {
            <span class="support support_function support_function_actionscript">addEventListener</span>( FlexEvent.CREATION_COMPLETE, creationCompleteHandler );
        }

        <span class="comment comment_block comment_block_actionscript"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_actionscript">/*</span>
         * creationComplete
         *
         * called when the AIR has finishe loading, sets up drag/drop event listeners reference objects
         *
         <span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_actionscript">*/</span></span>
        <span class="keyword keyword_control keyword_control_actionscript">private</span> <span class="meta meta_function meta_function_actionscript"><span class="storage storage_type storage_type_function storage_type_function_asp">function</span> <span class="entity entity_name entity_name_function entity_name_function_asp">creationCompleteHandler</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_begin punctuation_definition_parameters_begin_actionscript">(</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_asp"> event:FlexEvent </span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_end punctuation_definition_parameters_end_actionscript">)</span></span> <span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">:</span><span class="support support_function support_function_actionscript">void</span>
        {
            <span class="support support_function support_function_actionscript">addEventListener</span>( NativeDragEvent.NATIVE_DRAG_ENTER,    onDragEnter );
            <span class="support support_function support_function_actionscript">addEventListener</span>( NativeDragEvent.NATIVE_DRAG_DROP,     onDragDrop );
            upload_btn.<span class="support support_function support_function_actionscript">enabled</span> <span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">=</span> <span class="constant constant_language constant_language_actionscript">false</span>;
            upload_btn.<span class="support support_function support_function_actionscript">addEventListener</span>( MouseEvent.CLICK, upload );

            uploadURL <span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">=</span> <span class="keyword keyword_control keyword_control_actionscript">new</span> URLRequest();
            uploadURL.<span class="support support_function support_function_actionscript">url</span> <span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">=</span> <span class="string string_quoted string_quoted_double string_quoted_double_actionscript"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_actionscript">"</span>http://localhost:4000/upload<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_actionscript">"</span></span>;
            uploadURL.<span class="support support_function support_function_actionscript">method</span><span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">=</span>URLRequestMethod.POST;

            filesToUpload <span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">=</span> <span class="keyword keyword_control keyword_control_actionscript">new</span> <span class="support support_class support_class_actionscript">Array</span>();
            UploadProgressComponents <span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">=</span> <span class="keyword keyword_control keyword_control_actionscript">new</span> <span class="support support_class support_class_actionscript">Array</span>();
        }

        <span class="comment comment_block comment_block_actionscript"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_actionscript">/*</span>
         * onDragEnter
         *
         * files have been dragged into the app
         <span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_actionscript">*/</span></span>
        <span class="keyword keyword_control keyword_control_actionscript">private</span> <span class="meta meta_function meta_function_actionscript"><span class="storage storage_type storage_type_function storage_type_function_asp">function</span> <span class="entity entity_name entity_name_function entity_name_function_asp">onDragEnter</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_begin punctuation_definition_parameters_begin_actionscript">(</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_asp"> event:NativeDragEvent </span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_end punctuation_definition_parameters_end_actionscript">)</span></span> <span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">:</span><span class="support support_function support_function_actionscript">void</span>
        {
           DragManager.acceptDragDrop(<span class="support support_function support_function_actionscript">this</span>);
        }

        <span class="comment comment_block comment_block_actionscript"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_actionscript">/*</span>
         * onDragDrop
         *
         * when files are dropped...
         <span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_actionscript">*/</span></span>
        <span class="keyword keyword_control keyword_control_actionscript">private</span> <span class="meta meta_function meta_function_actionscript"><span class="storage storage_type storage_type_function storage_type_function_asp">function</span> <span class="entity entity_name entity_name_function entity_name_function_asp">onDragDrop</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_begin punctuation_definition_parameters_begin_actionscript">(</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_asp"> event:NativeDragEvent </span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_end punctuation_definition_parameters_end_actionscript">)</span></span> <span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">:</span><span class="support support_function support_function_actionscript">void</span>
        {
            DragManager.dropAction <span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">=</span> DragActions.COPY;
            <span class="keyword keyword_control keyword_control_actionscript">var</span> files<span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">:</span><span class="support support_class support_class_actionscript">Array</span> <span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">=</span> <span class="support support_function support_function_actionscript">event</span>.transferable.dataForFormat( TransferableFormats.FILE_LIST_FORMAT ) as <span class="support support_class support_class_actionscript">Array</span>;
            <span class="keyword keyword_control keyword_control_actionscript">for</span> each (<span class="keyword keyword_control keyword_control_actionscript">var</span> f<span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">:</span>File <span class="support support_function support_function_actionscript">in</span> files)
            {
               addFile( FileReference( f ) );
            }

            upload_btn.<span class="support support_function support_function_actionscript">enabled</span> <span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">=</span> <span class="constant constant_language constant_language_actionscript">true</span>;
        }

        <span class="comment comment_block comment_block_actionscript"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_actionscript">/*</span>
         * addFile
         *
         * ...add then to filesToUpload array, and the file upload listeners,
         * and create a progress component for each file
         <span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_actionscript">*/</span></span>
        <span class="keyword keyword_control keyword_control_actionscript">private</span> <span class="meta meta_function meta_function_actionscript"><span class="storage storage_type storage_type_function storage_type_function_asp">function</span> <span class="entity entity_name entity_name_function entity_name_function_asp">addFile</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_begin punctuation_definition_parameters_begin_actionscript">(</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_asp"> f:FileReference </span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_end punctuation_definition_parameters_end_actionscript">)</span></span> <span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">:</span><span class="support support_function support_function_actionscript">void</span>
        {
            filesToUpload.<span class="support support_function support_function_actionscript">push</span>( f );

            <span class="keyword keyword_control keyword_control_actionscript">var</span> upv<span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">:</span>UploadProgressComponent <span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">=</span> <span class="keyword keyword_control keyword_control_actionscript">new</span> UploadProgressComponent();
            UploadProgressComponents.<span class="support support_function support_function_actionscript">push</span>( upv );
            files_vb.addChild( upv );
            upv.file_lb.<span class="support support_function support_function_actionscript">text</span> <span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">=</span> f.<span class="support support_function support_function_actionscript">name</span>;
            upv.pb.<span class="support support_function support_function_actionscript">source</span> <span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">=</span> f;

            f.<span class="support support_function support_function_actionscript">addEventListener</span>( Event.COMPLETE, completeHandler );
            f.<span class="support support_function support_function_actionscript">addEventListener</span>( IOErrorEvent.IO_ERROR, ioErrorHandler );
        }

        <span class="comment comment_block comment_block_actionscript"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_actionscript">/*</span>
         * completeHandler
         *
         * a file upload is complete, remove it from filesToUpload
         * and remove the upload component
         <span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_actionscript">*/</span></span>
        <span class="keyword keyword_control keyword_control_actionscript">private</span> <span class="meta meta_function meta_function_actionscript"><span class="storage storage_type storage_type_function storage_type_function_asp">function</span> <span class="entity entity_name entity_name_function entity_name_function_asp">completeHandler</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_begin punctuation_definition_parameters_begin_actionscript">(</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_asp"> e:Event </span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_end punctuation_definition_parameters_end_actionscript">)</span></span> <span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">:</span><span class="support support_function support_function_actionscript">void</span>
        {
            <span class="keyword keyword_control keyword_control_actionscript">var</span> f<span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">:</span>FileReference <span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">=</span> FileReference(e.<span class="support support_function support_function_actionscript">target</span>);
            <span class="keyword keyword_control keyword_control_actionscript">for</span>( <span class="keyword keyword_control keyword_control_actionscript">var</span> i<span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">:</span>uint; i &lt; filesToUpload.<span class="support support_function support_function_actionscript">length</span>; i<span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">++</span> )
            {
                <span class="keyword keyword_control keyword_control_actionscript">if</span>( f.<span class="support support_function support_function_actionscript">name</span> <span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">==</span> filesToUpload[i].<span class="support support_function support_function_actionscript">name</span> )
                {
                    files_vb.removeChild( UploadProgressComponents[i] );
                    filesToUpload.<span class="support support_function support_function_actionscript">splice</span>(i, <span class="constant constant_numeric constant_numeric_actionscript">1</span>);
                    UploadProgressComponents.<span class="support support_function support_function_actionscript">splice</span>(i, <span class="constant constant_numeric constant_numeric_actionscript">1</span>);
                }
            }
        }

        <span class="comment comment_block comment_block_actionscript"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_actionscript">/*</span>
         * trace any errors
         <span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_actionscript">*/</span></span>
        <span class="keyword keyword_control keyword_control_actionscript">private</span> <span class="meta meta_function meta_function_actionscript"><span class="storage storage_type storage_type_function storage_type_function_asp">function</span> <span class="entity entity_name entity_name_function entity_name_function_asp">ioErrorHandler</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_begin punctuation_definition_parameters_begin_actionscript">(</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_asp"> event:IOErrorEvent </span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_end punctuation_definition_parameters_end_actionscript">)</span></span> <span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">:</span><span class="support support_function support_function_actionscript">void</span>
        {
            <span class="support support_function support_function_actionscript">trace</span>(<span class="string string_quoted string_quoted_double string_quoted_double_actionscript"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_actionscript">"</span>ioErrorHandler: <span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_actionscript">"</span></span> <span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">+</span> <span class="support support_function support_function_actionscript">event</span>);
        }

        <span class="comment comment_block comment_block_actionscript"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_actionscript">/*</span>
         * upload!
         <span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_actionscript">*/</span></span>
        <span class="keyword keyword_control keyword_control_actionscript">private</span> <span class="meta meta_function meta_function_actionscript"><span class="storage storage_type storage_type_function storage_type_function_asp">function</span> <span class="entity entity_name entity_name_function entity_name_function_asp">upload</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_begin punctuation_definition_parameters_begin_actionscript">(</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_asp"> e:MouseEvent </span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_end punctuation_definition_parameters_end_actionscript">)</span></span> <span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">:</span><span class="support support_function support_function_actionscript">void</span>
        {
            <span class="keyword keyword_control keyword_control_actionscript">for</span> each (<span class="keyword keyword_control keyword_control_actionscript">var</span> f<span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">:</span>File <span class="support support_function support_function_actionscript">in</span> filesToUpload)
            {
               f.upload( uploadURL );
            }
        }
    }
}</span></pre>
<p>The last file is the upload progress component, it&#8217;s progress bar listens for events from each file (<span class="source source_actionscript">upv.pb.<span class="support support_function support_function_actionscript">source</span> <span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">=</span> f;</span> above in the addFile method)</p>
<pre class="textmate-source"><span class="source source_mxml"><span class="meta meta_tag meta_tag_preprocessor meta_tag_preprocessor_xml"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_xml">&lt;?</span><span class="entity entity_name entity_name_tag entity_name_tag_xml">xml</span><span class="entity entity_other entity_other_attribute-name entity_other_attribute-name_xml"> version</span>=<span class="string string_quoted string_quoted_double string_quoted_double_xml"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_xml">"</span>1.0<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_xml">"</span></span><span class="entity entity_other entity_other_attribute-name entity_other_attribute-name_xml"> encoding</span>=<span class="string string_quoted string_quoted_double string_quoted_double_xml"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_xml">"</span>utf-8<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_xml">"</span></span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_xml">?&gt;</span></span>
<span class="meta meta_tag meta_tag_xml meta_tag_xml_template">&lt;<span class="entity entity_name entity_name_tag entity_name_tag_xml">mx:</span>VBox
    xmlns:mx=<span class="string string_quoted string_quoted_double string_quoted_double_xml">"http://www.adobe.com/2006/mxml"</span>
    paddingBottom=<span class="string string_quoted string_quoted_double string_quoted_double_xml">"5"</span> <span class="keyword keyword_operator keyword_operator_namespace-separator keyword_operator_namespace-separator_xml">paddingLeft</span>=<span class="string string_quoted string_quoted_double string_quoted_double_xml">"5"</span> <span class="keyword keyword_operator keyword_operator_namespace-separator keyword_operator_namespace-separator_xml">paddingRight</span>=<span class="string string_quoted string_quoted_double string_quoted_double_xml">"5"</span> <span class="keyword keyword_operator keyword_operator_namespace-separator keyword_operator_namespace-separator_xml">paddingTop</span>=<span class="string string_quoted string_quoted_double string_quoted_double_xml">"5"</span>
    borderColor=<span class="string string_quoted string_quoted_double string_quoted_double_xml">"#BABABA"</span> <span class="keyword keyword_operator keyword_operator_namespace-separator keyword_operator_namespace-separator_xml">borderStyle</span>=<span class="string string_quoted string_quoted_double string_quoted_double_xml">"solid"</span> <span class="keyword keyword_operator keyword_operator_namespace-separator keyword_operator_namespace-separator_xml">borderThickness</span>=<span class="string string_quoted string_quoted_double string_quoted_double_xml">"2"</span>
    width=<span class="string string_quoted string_quoted_double string_quoted_double_xml">"100%"</span>
    backgroundColor=<span class="string string_quoted string_quoted_double string_quoted_double_xml">"#F7F7F7"</span>&gt;</span>

    <span class="meta meta_tag meta_tag_xml meta_tag_xml_template">&lt;<span class="entity entity_name entity_name_tag entity_name_tag_xml">mx:</span>Label <span class="keyword keyword_operator keyword_operator_namespace-separator keyword_operator_namespace-separator_xml">id</span>=<span class="string string_quoted string_quoted_double string_quoted_double_xml">"file_lb"</span> <span class="keyword keyword_operator keyword_operator_namespace-separator keyword_operator_namespace-separator_xml">text</span>=<span class="string string_quoted string_quoted_double string_quoted_double_xml">"Label"</span> <span class="keyword keyword_operator keyword_operator_namespace-separator keyword_operator_namespace-separator_xml">fontWeight</span>=<span class="string string_quoted string_quoted_double string_quoted_double_xml">"bold"</span> <span class="keyword keyword_operator keyword_operator_namespace-separator keyword_operator_namespace-separator_xml">color</span>=<span class="string string_quoted string_quoted_double string_quoted_double_xml">"#000000"</span>/&gt;</span>
    <span class="meta meta_tag meta_tag_xml meta_tag_xml_template">&lt;<span class="entity entity_name entity_name_tag entity_name_tag_xml">mx:</span>ProgressBar <span class="keyword keyword_operator keyword_operator_namespace-separator keyword_operator_namespace-separator_xml">id</span>=<span class="string string_quoted string_quoted_double string_quoted_double_xml">"pb"</span> <span class="keyword keyword_operator keyword_operator_namespace-separator keyword_operator_namespace-separator_xml">labelPlacement</span>=<span class="string string_quoted string_quoted_double string_quoted_double_xml">"right"</span> <span class="keyword keyword_operator keyword_operator_namespace-separator keyword_operator_namespace-separator_xml">label</span>=<span class="string string_quoted string_quoted_double string_quoted_double_xml">""</span> <span class="keyword keyword_operator keyword_operator_namespace-separator keyword_operator_namespace-separator_xml">width</span>=<span class="string string_quoted string_quoted_double string_quoted_double_xml">"100%"</span>/&gt;</span>

<span class="meta meta_tag meta_tag_xml"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_xml">&lt;/</span><span class="entity entity_name entity_name_tag entity_name_tag_namespace entity_name_tag_namespace_xml">mx</span><span class="entity entity_name entity_name_tag entity_name_tag_xml"><span class="punctuation punctuation_separator punctuation_separator_namespace punctuation_separator_namespace_xml">:</span></span><span class="entity entity_name entity_name_tag entity_name_tag_localname entity_name_tag_localname_xml">VBox</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_xml">&gt;</span></span></span></pre>
<p>That&#8217;s it! test your AIR app by dragging some files from the file system, once you drop them the upload progress components show a visual representation of the files, click &#8216;upload files&#8217; and the files are upload all at once (for real real not for play play this time).</p>
<p><img src="http://blog.vixiom.com/uploads/merb_air_drag.png" width="547" height="437"><br />
<em>drag!</em></p>
<p><img src="http://blog.vixiom.com/uploads/merb_air_drop.png" width="329" height="421"><br />
<em>drop!</em></p>
<p><img src="http://blog.vixiom.com/uploads/merb_air_upload.png" width="329" height="425"><br />
<em>upload!</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alastairdawson.com/2007/06/29/merb-on-air-drag-and-drop-multiple-file-upload/feed/</wfw:commentRss>
		<slash:comments>37</slash:comments>
		</item>
		<item>
		<title>I heart Merb</title>
		<link>http://blog.alastairdawson.com/2007/06/27/i-heart-merb/</link>
		<comments>http://blog.alastairdawson.com/2007/06/27/i-heart-merb/#comments</comments>
		<pubDate>Thu, 28 Jun 2007 05:53:57 +0000</pubDate>
		<dc:creator>Alastair</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Merb]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://blog.vixiom.com/2007/06/27/i-heart-merb/</guid>
		<description><![CDATA[Yes every new framework sets my heart a flutter, but this time it&#8217;s for real.
Developing Flex/Flash on top of Rails? What if you could get ActiveRecord and RESTful routing at almost eight times the speed with 75% less RAM? How about all that and real concurrency, including true multiple file upload? All of the above [...]]]></description>
			<content:encoded><![CDATA[<p>Yes every new framework sets my heart a flutter, but this time it&#8217;s for real.</p>
<p>Developing Flex/Flash on top of Rails? What if you could get ActiveRecord and RESTful routing at almost eight times the speed with 75% less RAM? How about all that and real concurrency, including true multiple file upload? All of the above without the Rails <a href="http://www.37signals.com/svn/posts/487-what-if-i-actually-like-html-css-and-javascript">attitude</a>? You need to get you some <a href="http://merb.devjavu.com/">Merb</a>.</p>
<p>Models look the same:</p>
<pre class="textmate-source"><span class="source source_ruby source_ruby_rails"><span class="meta meta_rails meta_rails_model"><span class="meta meta_class meta_class_ruby"><span class="keyword keyword_control keyword_control_class keyword_control_class_ruby">class</span> <span class="entity entity_name entity_name_type entity_name_type_class entity_name_type_class_ruby">Photo<span class="entity entity_other entity_other_inherited-class entity_other_inherited-class_ruby"> <span class="punctuation punctuation_separator punctuation_separator_inheritance punctuation_separator_inheritance_ruby">&lt;</span> ActiveRecord::Base</span></span></span>
  <span class="support support_function support_function_activerecord support_function_activerecord_rails">belongs_to</span> <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>photo_roll</span>
  <span class="support support_function support_function_activerecord support_function_activerecord_rails">acts_as_list</span> <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>scope</span> =&gt; <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>photo_roll</span>

  <span class="meta meta_function meta_function_method meta_function_method_without-arguments meta_function_method_without-arguments_ruby"><span class="keyword keyword_control keyword_control_def keyword_control_def_ruby">def</span> <span class="entity entity_name entity_name_function entity_name_function_ruby">to_json</span></span>
    <span class="variable variable_language variable_language_ruby">self</span>.attributes.to_json
  <span class="keyword keyword_control keyword_control_ruby">end</span>
</span><span class="keyword keyword_control keyword_control_ruby">end</span></span></pre>
<p>Controllers look the same:</p>
<pre class="textmate-source"><span class="source source_ruby source_ruby_rails"><span class="meta meta_class meta_class_ruby"><span class="keyword keyword_control keyword_control_class keyword_control_class_ruby">class</span> <span class="entity entity_name entity_name_type entity_name_type_class entity_name_type_class_ruby">PhotoRolls<span class="entity entity_other entity_other_inherited-class entity_other_inherited-class_ruby"> <span class="punctuation punctuation_separator punctuation_separator_inheritance punctuation_separator_inheritance_ruby">&lt;</span> Application</span></span></span>

  <span class="meta meta_function meta_function_method meta_function_method_without-arguments meta_function_method_without-arguments_ruby"><span class="keyword keyword_control keyword_control_def keyword_control_def_ruby">def</span> <span class="entity entity_name entity_name_function entity_name_function_ruby">index</span></span>
    <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>photo_rolls</span> = <span class="support support_class support_class_ruby">PhotoRoll</span>.find(<span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>all</span>)
    <span class="support support_function support_function_actionpack support_function_actionpack_rails">render</span> <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>js</span> =&gt; <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>photo_rolls</span>.to_json
  <span class="keyword keyword_control keyword_control_ruby">end</span>

<span class="keyword keyword_control keyword_control_ruby">end</span>
</span></pre>
<p>Then consume away in Flex&#8230;</p>
<pre class="textmate-source"><span class="source source_actionscript"><span class="keyword keyword_control keyword_control_actionscript">public</span> <span class="meta meta_function meta_function_actionscript"><span class="storage storage_type storage_type_function storage_type_function_asp">function</span> <span class="entity entity_name entity_name_function entity_name_function_asp">find</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_begin punctuation_definition_parameters_begin_actionscript">(</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_end punctuation_definition_parameters_end_actionscript">)</span></span> <span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">:</span> <span class="support support_function support_function_actionscript">void</span>
        {
            <span class="keyword keyword_control keyword_control_actionscript">var</span> svc<span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">:</span>JSONRESTService <span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">=</span> <span class="keyword keyword_control keyword_control_actionscript">new</span> JSONRESTService();
            svc.<span class="support support_function support_function_actionscript">url</span> <span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript">=</span> <span class="string string_quoted string_quoted_double string_quoted_double_actionscript"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_actionscript">"</span>/photo_rolls<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_actionscript">"</span></span>
            svc.sendRESTfully( <span class="string string_quoted string_quoted_double string_quoted_double_actionscript"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_actionscript">"</span>index<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_actionscript">"</span></span>, <span class="constant constant_language constant_language_actionscript">null</span>, <span class="support support_function support_function_actionscript">onResult</span>, <span class="support support_function support_function_actionscript">onFault</span> );
        }</span></pre>
<p><em>That&#8217;s a custom JSON REST Service which will be showing up in a future tutorial.</em></p>
<p>or use HAML as a built in templating engine for all your HTML needs.</p>
<p><a href="http://merb.devjavu.com/">Merb!</a><br />
<a href="http://merb.rubyforge.org/files/README.html">Merb Docs! </a><br />
<a href="http://depixelate.com/2007/5/31/taking-merb-for-a-spin/comments/106">Merb Tutorial!</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alastairdawson.com/2007/06/27/i-heart-merb/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
