2012-07-17 42 views
13

Tôi muốn tải hình ảnh từ URL bằng kẹp giấy lên bộ nhớ S3. tôi làm việc với:Kẹp giấy: tải lên từ url có phần mở rộng

Ruby 1.9.3 
Rails 3.2.6 
paperclip 3.1.3 
aws-sdk 1.3.9 

Tôi có Hình mẫu của tôi:

class Asset 

    has_attached_file :asset, 
    :styles => {:thumb => "60x60>"}, 
    :storage => :s3, 
    :s3_credentials => "#{Rails.root}/config/s3.yml", 
    :path => "/pictures/:id/:style.:extension" 

    validates_attachment_content_type :asset, :content_type => ['image/gif', 'image/jpeg', 'image/png', 'image/x-ms-bmp'] 

end 

Vì vậy, về cơ bản tôi đã thực hiện này để tải tập tin của tôi từ một URL:

picture = Asset.new(asset: open("http://www.my_url.com/my_picture.jpg")) 
picture.save 

Nhưng nó lưu tập tin của tôi với một file_name sai và nó không đặt phần mở rộng của tập tin:

#<Asset id: 5, asset_file_name: "open-uri20120717-6028-1k3f7xz", asset_content_type: "image/jpeg", asset_update_at: nil, asset_file_size: 91565, created_at: "2012-07-17 12:41:40", updated_at: "2012-07-17 12:41:40"> 
p.asset.url 
    => http://s3.amazonaws.com/my_assets_path/pictures/5/original. 

Như bạn thấy không có phần mở rộng.

Tôi đã tìm thấy một phương pháp để giải quyết nó nhưng tôi chắc chắn rằng tôi có thể có một cách tốt hơn. Giải pháp này là để sao chép các tập tin trên máy tính của tôi sau đó tôi gửi nó trên S3 như thế này:

filename = "#{Rails.root}/tmp/my_picture.jpg" 
open(filename, 'wb') do |file| 
    file << open("http://www.my_url.com/my_picture.jpg").read 
end 

picture = Asset::Picture.new(asset: open(filename)) 
picture.save 

này hoạt động trên máy tính của tôi:

#<Asset::Picture id: 10, asset_file_name: "my_picture.jpg", asset_content_type: "image/jpeg", asset_update_at: nil, asset_file_size: 91565, created_at: "2012-07-17 12:45:30", updated_at: "2012-07-17 12:45:30"> 
p.asset.url 
    => "http://s3.amazonaws.com/assets.tests/my_assets_path/10/original.jpg" 

Tuy nhiên tôi không biết nếu phương pháp này sẽ làm việc trên Heroku (tôi lưu trữ ứng dụng của tôi trên đó).

Không có cách nào tốt hơn nếu không vượt qua một tệp tạm thời?

Trả lời

22

Thời gian tốt. Tôi vừa gửi một yêu cầu kéo được vá trong vài giờ trước (ngày 20 tháng 7 năm 2012) sẽ giúp cuộc sống của bạn trở nên thật dễ dàng.

self.asset = URI.parse("http://s3.amazonaws.com/blah/blah/blah.jpg") 

này sẽ tải hình ảnh jpeg của bạn, đảm bảo rằng tên tập tin là blah.jpg và kiểu nội dung là 'image/jpg'

Kẹp giấy phiên bản> 3.1.3 (bạn sẽ cần phải liên kết nó để github repo cho đến khi nó được phát hành).

CẬP NHẬT: xác nhận làm việc với phiên bản kẹp giấy> = 3.1.4

+2

Bạn cam kết hoạt động như một sự quyến rũ! Và nó bây giờ được bao gồm trong kẹp giấy 3.1.4 Đó là những gì tôi muốn. Làm tốt lắm! Cảm ơn bạn! –

+2

Xác nhận, hoạt động tốt với kẹp giấy 3.1.4. Bạn đã làm ngày hôm nay của tôi trở nên thú vị. Cảm ơn bạn! –

Các vấn đề liên quan