Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Loading…

How to add additional S3 metadata? #32

Open
rahilsondhi opened this Issue · 5 comments

3 participants

Rahil Sondhi Yuval Kordov Sheharyar Naseer
Rahil Sondhi

I'd like to add Content-Disposition: attachment to all uploaded files so that if the download link is visited, browsers are forced to download the file.

For example if you hit the download URL for an mp3 without Content-Disposition: attachment, Chrome will just stream the mp3 in the browser. But if you set Content-Disposition: attachment, Chrome will download the file.

Thanks!

Yuval Kordov

Also interested. Did you sort this out?

Yuval Kordov

A quick glance at the s3 doc shows that you can pass a "Content-Disposition" field with direct uploads. So you may be able to add/remove this field from the form at runtime by inspecting the filename of the uploaded file. Perhaps in the jquery file upload "add" callback?

Rahil Sondhi

Okay got it working.

In the Rails s3_uploader_form I added <%= hidden_field_tag 'Content-Disposition', 'attachment' %>

Then in config/initializers/s3_direct_upload.rb, I monkey patched the policy_data method. After the Content-Type line I added ["starts-with","$Content-Disposition",""],

Note that this means S3 will always expect the Content-Disposition field on every request. If you remove the hidden field, S3 will reject your requests because you're not providing all the fields you promised in the policy.

This isn't the best solution, but it solves my problem for now.

Here is my full initializer:

S3DirectUpload.config do |c|
  c.access_key_id = Settings.aws.s3_key
  c.secret_access_key = Settings.aws.s3_secret
  c.bucket = Settings.aws.s3_bucket
end

module S3DirectUpload
  module UploadHelper
    class S3Uploader
      def policy_data
        {
          expiration: @options[:expiration],
          conditions: [
            ["starts-with", "$utf8", ""],
            ["starts-with", "$key", ""],
            ["starts-with", "$x-requested-with", ""],
            ["content-length-range", 0, @options[:max_file_size]],
            ["starts-with","$Content-Type",""],
            ["starts-with","$Content-Disposition",""],
            {bucket: @options[:bucket]},
            {acl: @options[:acl]},
            {success_action_status: "201"}
          ]
        }
      end
    end
  end
end
Sheharyar Naseer

Thanks! Worked for me as well.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.