81 lines
2.2 KiB
Ruby
81 lines
2.2 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
|
|
|
|
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://#{@aws_bucket}/#{filename}"
|
|
end
|
|
|
|
def url(filename)
|
|
"https://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(path, options = @@def_opts)
|
|
s3_bucket.objects[path].url_for(:read, options).to_s
|
|
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 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 |