95 lines
2.6 KiB
Ruby
95 lines
2.6 KiB
Ruby
require 'aws-sdk'
|
|
require 'active_support/all'
|
|
require 'openssl'
|
|
|
|
module JamRuby
|
|
|
|
class S3Manager
|
|
|
|
@@def_opts = { :expires => 3600 * 24, :secure => true } # 24 hours from now
|
|
|
|
S3_PREFIX = 's3://'
|
|
|
|
def initialize(aws_bucket, aws_key, aws_secret)
|
|
@aws_bucket = aws_bucket
|
|
@s3 = AWS::S3.new(:access_key_id => aws_key, :secret_access_key => aws_secret)
|
|
@aws_key = aws_key
|
|
@aws_secret = aws_secret
|
|
end
|
|
|
|
def s3_url(filename)
|
|
"#{S3_PREFIX}#{@aws_bucket}/#{filename}"
|
|
end
|
|
|
|
def s3_url?(filename)
|
|
filename.start_with? S3_PREFIX
|
|
end
|
|
|
|
def url(filename, options = @@def_opts)
|
|
"http#{options[:secure] ? "s" : ""}://s3.amazonaws.com/#{@aws_bucket}/#{filename}"
|
|
end
|
|
|
|
def upload_sign(filename, content_md5, part_number, upload_id)
|
|
hdt = http_date_time
|
|
str_to_sign = "PUT\n#{content_md5}\n#{content_type}\n#{hdt}\n/#{@aws_bucket}/#{filename}?partNumber=#{part_number}&uploadId=#{upload_id}"
|
|
signature = Base64.encode64(OpenSSL::HMAC.digest(OpenSSL::Digest::Digest.new('sha1'), @aws_secret, str_to_sign)).chomp
|
|
{ :datetime => hdt,
|
|
:md5 => content_md5,
|
|
:url => "https://s3.amazonaws.com/#{@aws_bucket}/#{filename}?partNumber=#{part_number}&uploadId=#{upload_id}",
|
|
:authorization => "AWS #{@aws_key}:#{signature}"
|
|
}
|
|
end
|
|
|
|
def sign_url(key, options = @@def_opts, operation = :read)
|
|
s3_bucket.objects[key].url_for(operation, options).to_s
|
|
end
|
|
|
|
def presigned_post(key, options = @@def_opts)
|
|
s3_bucket.objects[key].presigned_post(options)
|
|
end
|
|
|
|
def multipart_upload_start(upload_filename)
|
|
s3_bucket.objects[upload_filename].multipart_upload.id
|
|
end
|
|
|
|
def multipart_upload_complete(upload_filename, upload_id)
|
|
s3_bucket.objects[upload_filename].multipart_uploads[upload_id].complete(:remote_parts)
|
|
end
|
|
|
|
def multipart_upload_abort(upload_filename, upload_id)
|
|
s3_bucket.objects[upload_filename].multipart_uploads[upload_id].abort
|
|
end
|
|
|
|
def multiple_upload_find_part(upload_filename, upload_id, part)
|
|
s3_bucket.objects[upload_filename].multipart_uploads[upload_id].parts[part]
|
|
end
|
|
|
|
def delete(filename)
|
|
s3_bucket.objects[filename].delete
|
|
end
|
|
|
|
def upload(key, filename)
|
|
s3_bucket.objects[key].write(:file => filename)
|
|
end
|
|
|
|
def delete_folder(folder)
|
|
s3_bucket.objects.with_prefix(folder).delete_all
|
|
end
|
|
|
|
private
|
|
|
|
def s3_bucket
|
|
@s3.buckets[@aws_bucket]
|
|
end
|
|
|
|
def content_type
|
|
"audio/ogg"
|
|
end
|
|
|
|
def http_date_time
|
|
Time.now.strftime("%a, %d %b %Y %H:%M:%S %z")
|
|
end
|
|
|
|
|
|
end
|
|
end |