12/08/2018, 15:13

Uploading files lên S3 bằng AWS SDK Ruby Gem

Để upload files lên kho lưu trữ Amazon S3 của bạn, bạn có thể sử dụng phiên bản aws-sdk 2. Theo mặc định gem sẽ tìm kiếm các thôn tin xác thực trong các biến môi trường. Vì vậy, bạn phải export các giá trị trên terminal như sau: export AWS_ACCESS_KEY_ID='my-very-secret-key' Bạn có thẻ xác minh nó ...

Để upload files lên kho lưu trữ Amazon S3 của bạn, bạn có thể sử dụng phiên bản aws-sdk 2. Theo mặc định gem sẽ tìm kiếm các thôn tin xác thực trong các biến môi trường. Vì vậy, bạn phải export các giá trị trên terminal như sau: export AWS_ACCESS_KEY_ID='my-very-secret-key' Bạn có thẻ xác minh nó được thiết lập bằng cách thực hiện: echo $AWS_ACCESS_KEY_ID Bạn phải đặt AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY và AWS_REGION. Bạn có thể tạo một tài nguyên S3 cho vùng nơi chứa những lưu trữ của bạn và tạo một đối tượng có tên tệp duy nhất và gọi upload_file như dưới đây:

require 'aws-sdk'

file_name = 'your-file.mp4'

s3 = Aws::S3::Resource.new(region: ENV['AWS_REGION'])
obj = s3.bucket('your-s3-bucket-name').object(file_name)
puts "Uploading file #{file_name}"
obj.upload_file("/Users/username/path/to/#{file_name}")
puts "Done"

Chúng ta có thể thêm một con quay để chắc chắn rằng tiến độ đang được thực hiện. Phiên bản sửa đổi như sau:

require 'aws-sdk'

def with_spinner
  chars = %w[| / - ]
  not_done = true
  spinner = Thread.new do
    while not_done do  
      print chars.rotate!.first
      sleep 0.1
      print ""
    end
  end
  yield.tap do         # After yielding to the block, save the return value
    not_done = false   # Tell the thread to exit, cleaning up after itself…
    spinner.join       # …and wait for it to do so.
  end                  # Use the block's return value as the method's
end

# By default aws-sdk looks at these environment variables
# ENV['AWS_REGION'], ENV['AWS_ACCESS_KEY_ID'] and ENV['AWS_SECRET_ACCESS_KEY'] 

def actual_job
  ENV['AWS_REGION'] = 'us-east-1'
  file_name = 'test.mp4'

  s3 = Aws::S3::Resource.new(region: ENV['AWS_REGION'])
  obj = s3.bucket('s3-bucket-name').object(file_name)
  print "Uploading file #{file_name}"

  obj.upload_file("/Users/bugs/Desktop/#{file_name}")
end

with_spinner do 
  actual_job
end

puts "Done!"

Để lấy kích thước file tồi thường sử dụng lệnh curl, bạn có thể thực hiện bất kì lệnh nào trong ruby bằng cách sử dụng phương thức đánh dấu Kernel.

command = `curl -I -s https://your-s3-bucket-url/test.mp4 | grep 'Content-Length'`
puts command

Thay vì sử dụng curl, để nhất quán, chúng ta có thể sử dụng aws-sdk thư viện để tìm ra kích thước tập tin:

require 'aws-sdk'

file = Aws::S3::Object.new('your-s3-bucket', 'your-s3-file-name-with-extension')
puts file.content_length

Điều này tự động hoá một số bước của quy trình làm việc screencast cho rubyplus.com. Vì tôi không còn phải đăng nhập vào trình quản lý mật khẩu, hãy đăng nhập vào giao diện điều khiển của aws, sử dụng giao diện người dùng của họ để đi đến nhóm chính xác và tải tệp lên theo cách thủ công.

0