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 = 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)
57 58 59 |
# File 'lib/aws/s3/presigned_post.rb', line 57 def bucket @bucket end |
#content_length ⇒ Range (readonly)
73 74 75 |
# File 'lib/aws/s3/presigned_post.rb', line 73 def content_length @content_length end |
#expires ⇒ Object (readonly)
98 99 100 |
# File 'lib/aws/s3/presigned_post.rb', line 98 def expires @expires end |
#ignored_fields ⇒ Array<String> (readonly)
94 95 96 |
# File 'lib/aws/s3/presigned_post.rb', line 94 def ignored_fields @ignored_fields end |
#key ⇒ String (readonly)
63 64 65 |
# File 'lib/aws/s3/presigned_post.rb', line 63 def key @key end |
#metadata ⇒ Hash (readonly)
69 70 71 |
# File 'lib/aws/s3/presigned_post.rb', line 69 def end |
Instance Method Details
#fields ⇒ Hash
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
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
220 221 222 |
# File 'lib/aws/s3/presigned_post.rb', line 220 def secure? @secure end |
#url ⇒ URI::HTTP, URI::HTTPS
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 |