<?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>Snow Giraffe Tech &#187; bucket</title>
	<atom:link href="http://www.snowgiraffe.com/tech/tag/bucket/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.snowgiraffe.com/tech</link>
	<description>rails, rubies, and sometimes dolphins</description>
	<lastBuildDate>Mon, 07 Jun 2010 14:36:05 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Creating Folders Programmatically with Amazon S3&#8217;s API: putting babies in buckets</title>
		<link>http://www.snowgiraffe.com/tech/147/creating-folders-programmatically-with-amazon-s3s-api-putting-babies-in-buckets/</link>
		<comments>http://www.snowgiraffe.com/tech/147/creating-folders-programmatically-with-amazon-s3s-api-putting-babies-in-buckets/#comments</comments>
		<pubDate>Fri, 06 Feb 2009 06:02:47 +0000</pubDate>
		<dc:creator>blythe</dc:creator>
				<category><![CDATA[Amazon S3]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[babies]]></category>
		<category><![CDATA[bucket]]></category>
		<category><![CDATA[files]]></category>
		<category><![CDATA[folder]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.snowgiraffe.com/tech/?p=147</guid>
		<description><![CDATA[Add folders to your Amazon S3 buckets]]></description>
			<content:encoded><![CDATA[<div id="attachment_165" class="wp-caption alignleft" style="width: 106px"><a rel="attachment wp-att-165" href="http://www.snowgiraffe.com/tech/?attachment_id=165"><img class="size-medium wp-image-165" title="baby_bucket" src="http://www.snowgiraffe.com/tech/wp-content/uploads/2009/02/baby_bucket-228x300.jpg" alt="Be careful of folder babies in buckets! photo by Patrish McLean" width="96" height="126" /></a><p class="wp-caption-text">Be careful of folder babies in buckets! photo by Patrish McLean</p></div>
<p>Back in the &#8216;burgh at <a href="http://www.wrct.org/" target="_blank">Carnegie Mellon&#8217;s radio station WRCT</a>, a really awesome poster with a baby crawling to its death in a bucket reminded you of how dangerous buckets can really be. Especially when DJing techno.  I can&#8217;t work with <a href="http://aws.amazon.com/s3/" target="_blank">Amazon S3</a> without wishing all my baby resources and folders and files would crawl in to an S3 death bucket and vanish. OMG AMAZON!</p>
<p>So anyhoo, to create folders instead of just files (or what appears to be folders in the awesome <a href="https://addons.mozilla.org/en-US/firefox/addon/3247" target="_blank">S3 firefox organizer</a>), do a <span class="inline_code">PUT</span> with:</p>
<div style='padding:0px 0px 0px 120px'>
<ul>
<li>header <span class="inline_code orange_text">content_type</span> to <span class="inline_code orange_text" >binary/octet-stream</span></li>
<li>append <span class="inline_code orange_text">_$folder$</span> to the end of the path name (as the extension)</li>
<li>set the data to blank</li>
</ul>
</div>
<p>This bitty rails code demonstrates this using the  <a href="http://amazon.rubyforge.org/">S3 plugin</a>:</p>
<p><span id="more-147"></span></p>
<div id="s3rubycode">
<pre>  <span class="constant">S3_FOLDER_EXT</span> <span class="punct">=</span> <span class="punct">'</span><span class="string">_$folder$</span><span class="punct">'</span>
  <span class="keyword">def </span><span class="method">exists_in_S3?</span><span class="punct">(</span><span class="ident">file_name</span><span class="punct">,</span> <span class="ident">bucket_name</span><span class="punct">,</span> <span class="ident">options</span> <span class="punct">={})</span>
    <span class="ident">connect_to_S3</span> 

    <span class="ident">file_search_name</span> <span class="punct">=</span> <span class="ident">file_name</span><span class="punct">.</span><span class="ident">dup</span>
    <span class="ident">file_search_name</span> <span class="punct">&lt;&lt;</span> <span class="constant">S3_FOLDER_EXT</span> <span class="keyword">if</span> <span class="ident">options</span><span class="punct">[</span><span class="symbol">:folder</span><span class="punct">]</span>

    <span class="constant">AWS</span><span class="punct">::</span><span class="constant">S3</span><span class="punct">::</span><span class="constant">Bucket</span><span class="punct">.</span><span class="ident">objects</span><span class="punct">(</span><span class="ident">bucket_name</span><span class="punct">,</span> <span class="symbol">:prefix</span> <span class="punct">=&gt;</span> <span class="ident">file_search_name</span><span class="punct">).</span><span class="ident">any?</span>

  <span class="keyword">end</span>

  <span class="keyword">def </span><span class="method">create_S3_folder</span><span class="punct">(</span><span class="ident">file_name</span><span class="punct">,</span> <span class="ident">bucket_name</span><span class="punct">,</span> <span class="ident">options</span><span class="punct">={})</span>
    <span class="ident">connect_to_S3</span>
    <span class="ident">folder</span> <span class="punct">=</span> <span class="constant">AWS</span><span class="punct">::</span><span class="constant">S3</span><span class="punct">::</span><span class="constant">S3Object</span><span class="punct">.</span><span class="ident">store</span><span class="punct">(</span><span class="ident">file_name</span> <span class="punct">+</span> <span class="constant">S3_FOLDER_EXT</span><span class="punct">,</span> <span class="punct">'</span><span class="punct">',</span> <span class="ident">bucket_name</span><span class="punct">,</span>
      <span class="punct">{</span><span class="symbol">:access</span> <span class="punct">=&gt;</span> <span class="symbol">:public_read</span><span class="punct">,</span>
       <span class="symbol">:content_type</span> <span class="punct">=&gt;</span> <span class="punct">"</span><span class="string">binary/octet-stream</span><span class="punct">",</span>
       <span class="symbol">:cache_control</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">max-age=3600,post-check=900,pre-check=3600</span><span class="punct">'</span> <span class="punct">}.</span><span class="ident">update</span><span class="punct">(</span><span class="ident">options</span><span class="punct">))</span>
  <span class="keyword">end</span>

  <span class="keyword">def </span><span class="method">connect_to_S3</span>
    <span class="keyword">unless</span> <span class="constant">AWS</span><span class="punct">::</span><span class="constant">S3</span><span class="punct">::</span><span class="constant">Base</span><span class="punct">.</span><span class="ident">connected?</span>
      <span class="constant">AWS</span><span class="punct">::</span><span class="constant">S3</span><span class="punct">::</span><span class="constant">Base</span><span class="punct">.</span><span class="ident">establish_connection!</span><span class="punct">(</span><span class="symbol">:access_key_id</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">blah</span><span class="punct">',</span> <span class="symbol">:secret_access_key</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">giraffe!</span><span class="punct">')</span>
    <span class="keyword">end</span>
  <span class="keyword">end</span></pre>
<p>So your request path would look like:<br />
<span class="inline_code">/baby_bucket?prefix=folder1/folder2_$folder$</span><br />
And the output:<br />
<span class="inline_code"><br />
&lt;ListBucketResult xmlns=&#8221;http://s3.amazonaws.com/doc/2006-03-01/&#8221;&gt;<br />
&lt;Name&gt;baby_bucket&lt;/Name&gt;<br />
&lt;Prefix&gt;folder1/folder2_$folder$&lt;/Prefix&gt;<br />
&lt;Marker&gt;&lt;/Marker&gt;<br />
&lt;MaxKeys&gt;1000&lt;/MaxKeys&gt;<br />
&lt;IsTruncated&gt;false&lt;/IsTruncated&gt;<br />
&lt;/ListBucketResult&gt;<br />
</span></div>
<p>At this point, you should ask yourself why you want to create folders in the first place. Because I want to stick my head in a bucket right now.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.snowgiraffe.com/tech/147/creating-folders-programmatically-with-amazon-s3s-api-putting-babies-in-buckets/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
