s3-swf-upload-plugin icon indicating copy to clipboard operation
s3-swf-upload-plugin copied to clipboard

Note: there is a fine Rails3 replacement for this old thing! http://github.com/nathancolgate/s3-swf-upload-plugin . However... this one is:.... A rails plugin which allow user upload files to S3 t...

S3SwfUpload

S3SwfUpload allow user uploading a file to S3 directly, so you can save the cost of uploading process in your app server.

Install

./script/plugin install git://github.com/GreenAsJade/s3-swf-upload-plugin.git

Example

There is an example app showing how to use this at

http://github.com/GreenAsJade/demo-s3-swf-upload/tree/master

It's live at

http://demo-s3-swf-upload.heroku.com/

Usage

  1. $ script/generate s3_swf_upload

  2. Edit app/controller/s3_uploads_controller.rb

    You need to skip any authentication for this controller, the flash needs to be able to access it. There's a big comment showing you where to do this :)

  3. Configure your amazon parameters. Either set these through the following environment variables:

     AMAZON_S3_SWF_UPLOAD_BUCKET => my_public_bucket
     AMAZON_ACCESS_KEY_ID        => secret
     AMAZON_SECRET_ACCESS_KEY    => very secret
     AMAZON_S3_SWF_UPLOAD_ACL    => public-read
     AMAZON_S3_SWF_MAX_FILE_SIZE => 209715200
    

    or hardcode them in config/amazon_s3.yml

    (The corresponding yml vars are: bucket_name, access_key_id, secret_access_key, acl, max_file_size)

    The acl will default to private.

    Your rails app can also change bucket, acl and max file size like this:

    S3SwfUpload::S3Config.bucket = 'different_one' S3SwfUpload::S3Config.acl = 'private' S3SwfUpload::S3Config.max_file_size = 1024

  4. Upload a crossdomain.xml in your bucket and make it public-read.

    You can find what you need in generators/s3-swf-upload/templates in the plugin!

  5. init s3_swf object:

<%= s3_swf_upload_tag %>

  1. When you click upload, your file will be upload to http://bucket.s3.amazonasw.com/ by default.

    IE the default prefix is '' (no prefix)

  2. If you want to customise its behavior, here's a more complex example:

<%= s3_swf_upload_tag(:width => 310, :height => 40, :success => 'alert("success");', :failed => 'alert("failed");', :selected => 'alert("selected");', :prefix => 'prefix_in_bucket', :initialMessage => 'Press this button to find the file to upload" :upload => 'Press Here To Activate Upload', :do_checks => '0') %>

In this case, files will be uploaded to http://bucket.s3.amazonasw.com/prefix_in_bucket/filename

  1. If you need to check that the file they have selected is legitimate, before it gets uploaded, (for example, to make sure they aren't overwriting a file of the same name your database knows is already uploaded):

    i) Supply a method s3_swf_upload_error? in your application.rb to check, like this:

    def s3_swf_upload_file_error?(filename) Mod.find_by_zip_name(File::basename(filename)) ? "Sorry, there is already a mod with that zip file name!" : nil end

    Note that this method must return nil if there no error.

    ii) Set the option

    :do_checks => '1'

    in the s3_swf_upload_tag

Copyright (c) 2008 elctech, released under the MIT license