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.
195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 |
# File 'lib/aws/s3/presigned_post.rb', line 195 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.
97 98 99 |
# File 'lib/aws/s3/presigned_post.rb', line 97 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.
93 94 95 |
# File 'lib/aws/s3/presigned_post.rb', line 93 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).
342 343 344 345 346 347 348 349 350 351 352 |
# File 'lib/aws/s3/presigned_post.rb', line 342 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.
329 330 331 332 333 334 335 |
# File 'lib/aws/s3/presigned_post.rb', line 329 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.
219 220 221 |
# File 'lib/aws/s3/presigned_post.rb', line 219 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.
227 228 229 230 231 232 |
# File 'lib/aws/s3/presigned_post.rb', line 227 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.
305 306 307 308 309 310 |
# File 'lib/aws/s3/presigned_post.rb', line 305 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.
324 325 326 |
# File 'lib/aws/s3/presigned_post.rb', line 324 def (field) where("x-amz-meta-#{field}") end |