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.
187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 |
# File 'lib/aws/s3/presigned_post.rb', line 187 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 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.
98 99 100 |
# File 'lib/aws/s3/presigned_post.rb', line 98 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.
94 95 96 |
# File 'lib/aws/s3/presigned_post.rb', line 94 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).
328 329 330 331 332 333 334 335 336 337 338 |
# File 'lib/aws/s3/presigned_post.rb', line 328 def fields signature = config.signer.sign(policy, "sha1") { "AWSAccessKeyId" => config.signer.access_key_id, "key" => key, "policy" => policy, "signature" => signature }.merge(optional_fields) end |
#policy ⇒ String
Returns The Base64-encoded JSON policy document.
315 316 317 318 319 320 321 |
# File 'lib/aws/s3/presigned_post.rb', line 315 def policy json = { "expiration" => format_expiration, "conditions" => generate_conditions }.to_json Base64.encode64(json) end |
#secure? ⇒ Boolean
Returns True if #url generates an HTTPS url.
205 206 207 |
# File 'lib/aws/s3/presigned_post.rb', line 205 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.
213 214 215 216 217 218 |
# File 'lib/aws/s3/presigned_post.rb', line 213 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.
291 292 293 294 295 296 |
# File 'lib/aws/s3/presigned_post.rb', line 291 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.
310 311 312 |
# File 'lib/aws/s3/presigned_post.rb', line 310 def (field) where("x-amz-meta-#{field}") end |