Class: AWS::S3::PresignedPost
- Inherits:
-
Object
- Object
- AWS::S3::PresignedPost
- Defined in:
- lib/aws/s3/presigned_post.rb
Overview
Helper to generate form fields for presigned POST requests to a bucket. You can use this to create a form that can be used from a web browser to upload objects to S3 while specifying conditions on what can be uploaded and how it is processed and stored.
Defined Under Namespace
Classes: ConditionBuilder
Instance Attribute Summary collapse
-
#bucket ⇒ Bucket
readonly
The bucket to which data can be uploaded using the form fields.
-
#content_length ⇒ Range
readonly
The range of acceptable object sizes for the upload.
-
#expires ⇒ Object
readonly
The expiration time for the signature.
-
#ignored_fields ⇒ Array<String>
readonly
Additional fields which may be sent with the upload.
-
#key ⇒ String
readonly
The key of the object that will be uploaded.
-
#metadata ⇒ Hash
readonly
A hash of the metadata fields included in the signed fields.
Instance Method Summary collapse
-
#fields ⇒ Hash
A collection of form fields (including a signature and a policy) that can be used to POST data to S3.
-
#initialize(bucket, opts = {}) ⇒ PresignedPost
constructor
Creates a new presigned post object.
-
#policy ⇒ String
The Base64-encoded JSON policy document.
-
#secure? ⇒ Boolean
True if #url generates an HTTPS url.
-
#url ⇒ URI::HTTP, URI::HTTPS
The URL to which the form fields should be POSTed.
-
#where(field) ⇒ ConditionBuilder
Adds a condition to the policy for the POST.
-
#where_metadata(field) ⇒ ConditionBuilder
Adds a condition to the policy for the POST to constrain the values of metadata fields uploaded with the object.
Constructor Details
#initialize(bucket, opts = {}) ⇒ PresignedPost
Creates a new presigned post object.
198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 |
# File 'lib/aws/s3/presigned_post.rb', line 198 def initialize(bucket, opts = {}) @bucket = bucket @key = opts[:key] @secure = (opts[:secure] != false) @fields = {} SPECIAL_FIELDS.each do |name| @fields[name] = opts[name] if opts.key?(name) end @metadata = opts[:metadata] || {} @content_length = range_value(opts[:content_length]) @conditions = opts[:conditions] || {} @ignored_fields = [opts[:ignore]].flatten.compact @expires = opts[:expires] super @fields[:server_side_encryption] = config.s3_server_side_encryption unless @fields.key?(:server_side_encryption) @fields.delete(:server_side_encryption) if @fields[:server_side_encryption].nil? end |
Instance Attribute Details
#bucket ⇒ Bucket (readonly)
Returns The bucket to which data can be uploaded using the form fields.
59 60 61 |
# File 'lib/aws/s3/presigned_post.rb', line 59 def bucket @bucket end |
#content_length ⇒ Range (readonly)
Returns The range of acceptable object sizes for the upload. By default any size object may be uploaded.
75 76 77 |
# File 'lib/aws/s3/presigned_post.rb', line 75 def content_length @content_length end |
#expires ⇒ Object (readonly)
Returns The expiration time for the signature. By default the signature will expire an hour after it is generated.
100 101 102 |
# File 'lib/aws/s3/presigned_post.rb', line 100 def expires @expires end |
#ignored_fields ⇒ Array<String> (readonly)
Returns Additional fields which may be sent with the upload. These will be included in the policy so that they can be sent with any value. S3 will ignore them.
96 97 98 |
# File 'lib/aws/s3/presigned_post.rb', line 96 def ignored_fields @ignored_fields end |
#key ⇒ String (readonly)
Returns The key of the object that will be uploaded. If this is nil, then the object can be uploaded with any key that satisfies the conditions specified for the upload (see #where).
65 66 67 |
# File 'lib/aws/s3/presigned_post.rb', line 65 def key @key end |
#metadata ⇒ Hash (readonly)
Returns A hash of the metadata fields included in the signed fields. Additional metadata fields may be provided with the upload as long as they satisfy the conditions specified for the upload (see #where).
71 72 73 |
# File 'lib/aws/s3/presigned_post.rb', line 71 def @metadata end |
Instance Method Details
#fields ⇒ Hash
Returns A collection of form fields (including a signature and a policy) that can be used to POST data to S3. Additional form fields may be added after the fact as long as they are described by a policy condition (see #where).
345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 |
# File 'lib/aws/s3/presigned_post.rb', line 345 def fields secret = config.credential_provider.secret_access_key signature = Core::Signer.sign(secret, policy, 'sha1') fields = { "AWSAccessKeyId" => config.credential_provider.access_key_id, "key" => key, "policy" => policy, "signature" => signature }.merge(optional_fields) if token = config.credential_provider.session_token fields["x-amz-security-token"] = token end fields.merge(optional_fields) end |
#policy ⇒ String
Returns The Base64-encoded JSON policy document.
332 333 334 335 336 337 338 |
# File 'lib/aws/s3/presigned_post.rb', line 332 def policy json = { "expiration" => format_expiration, "conditions" => generate_conditions }.to_json Base64.encode64(json).tr("\n","") end |
#secure? ⇒ Boolean
Returns True if #url generates an HTTPS url.
222 223 224 |
# File 'lib/aws/s3/presigned_post.rb', line 222 def secure? @secure end |
#url ⇒ URI::HTTP, URI::HTTPS
Returns The URL to which the form
fields should be POSTed. If you are using the fields in
an HTML form, this is the URL to put in the action
attribute of the form tag.
230 231 232 233 234 235 |
# File 'lib/aws/s3/presigned_post.rb', line 230 def url req = Request.new req.bucket = bucket.name req.host = config.s3_endpoint build_uri(req) end |
#where(field) ⇒ ConditionBuilder
Adds a condition to the policy for the POST. Use #where_metadata to add metadata conditions.
308 309 310 311 312 313 |
# File 'lib/aws/s3/presigned_post.rb', line 308 def where(field) raise ArgumentError.new("unrecognized field name #{field}") unless [:key, :content_length, *SPECIAL_FIELDS].include?(field) or field =~ /^x-amz-meta-/ ConditionBuilder.new(self, field) end |
#where_metadata(field) ⇒ ConditionBuilder
Adds a condition to the policy for the POST to constrain the values of metadata fields uploaded with the object. If a metadata field does not have a condition associated with it and is not specified in the constructor (see #metadata) then S3 will reject it.
327 328 329 |
# File 'lib/aws/s3/presigned_post.rb', line 327 def (field) where("x-amz-meta-#{field}") end |