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.
196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 |
# File 'lib/aws/s3/presigned_post.rb', line 196 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.
57 58 59 |
# File 'lib/aws/s3/presigned_post.rb', line 57 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.
73 74 75 |
# File 'lib/aws/s3/presigned_post.rb', line 73 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).
63 64 65 |
# File 'lib/aws/s3/presigned_post.rb', line 63 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).
69 70 71 |
# File 'lib/aws/s3/presigned_post.rb', line 69 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).
343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 |
# File 'lib/aws/s3/presigned_post.rb', line 343 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.
330 331 332 333 334 335 336 |
# File 'lib/aws/s3/presigned_post.rb', line 330 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.
220 221 222 |
# File 'lib/aws/s3/presigned_post.rb', line 220 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.
228 229 230 231 232 233 |
# File 'lib/aws/s3/presigned_post.rb', line 228 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.
306 307 308 309 310 311 |
# File 'lib/aws/s3/presigned_post.rb', line 306 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.
325 326 327 |
# File 'lib/aws/s3/presigned_post.rb', line 325 def (field) where("x-amz-meta-#{field}") end |