2013-06-04 40 views
29

Tôi chỉ muốn biết cách tải lên url tệp từ xa bằng cách sử dụng Carrierwave trong bảng điều khiển Rails.Tải lên url của tệp từ xa từ Bảng điều khiển Rails với Carrierwave

Tôi đã thử những điều sau mà không gặp bất kỳ sự may mắn nào. Tôi cho rằng nó không xử lý Trình tải lên?

user = User.first 
user.remote_avatar_url = "http://www.image.com/file.jpg" 
user.save 

Rất cám ơn

+1

Đây là cú pháp chính xác. Development.log của bạn nói gì? –

+1

mà tất nhiên giả định User 'mounts_uploader: avatar' –

+0

Cảm ơn bạn đã trả lời Jesse. Tôi là người dùng mount_uploader: avatar, AvatarUploader. Nhật ký của tôi không thực sự hiển thị bất kỳ thứ gì. Chắc chắn là tôi đang thiếu gì đó. Nó hoạt động tốt thông qua trình duyệt. –

Trả lời

5
user = User.first 
user.remote_avatar = File.open(FILE_LOCATION) 
user.save 

FILE_LOCATION có thể

File.join(Rails.root, '/files/png-sample.png') 

nếu tập tin được tìm thấy trong một thư mục 'files' trong đường ray dự án

+0

câu hỏi là làm thế nào tôi có thể tải lên một tệp từ một VỊ TRÍ XÓA (một URL từ xa). Không phải tệp trên hệ thống của tôi. –

+1

nếu vậy thì chỉ cần sử dụng phương thức 'user.remote_avatar_url =" www.example.com/image.jpg', Carrierwave sẽ chỉ cần tải xuống tệp và thêm lại tệp đó lên ứng dụng của bạn –

15

Hãy nhìn vào các 'Tải lên tệp từ vị trí từ xa 'trên trang này https://github.com/carrierwaveuploader/carrierwave

CarrierWave nên ném ra một lỗi nếu url của địa điểm không hợp lệ

2.1.3 :015 > image.remote_image_url = "http" 
=> "http" 
2.1.3 :016 > image.save! 
    (0.2ms) BEGIN 
    (0.2ms) ROLLBACK 
ActiveRecord::RecordInvalid: Validation failed: Image trying to download a file which is not served over HTTP 

Hoặc nếu nó là một máy chủ chưa biết:

2.1.3 :017 > image.remote_image_url = "http://foobar" 
=> "http://foobar" 
2.1.3 :018 > image.save! 
    (0.4ms) BEGIN 
    (0.4ms) ROLLBACK 
ActiveRecord::RecordInvalid: Validation failed: Image could not download file: getaddrinfo: nodename nor servname provided, or not known 

Xin lưu ý rằng nếu bạn muốn tải hình ảnh từ xa bạn nên thêm tiền tố vào thuộc tính với remote_ và hậu tố nó với _url, như được hiển thị trong ví dụ

0

Hoạt động như sau:

url='http://host.domain/file.jpg'  
time=Time.now.to_i.to_s 
myfile=IO.sysopen("tmp/"+time+"_img."+url.split(".").last,"wb+") 
tmp_img=IO.new(myfile,"wb") 
tmp_img.write open(URI.encode(url)).read 

if File.exist?("tmp/"+time+"_img."+url.split(".").last) 
    "tmp/"+time+"_img."+url.split(".").last 
    image = ActionDispatch::Http::UploadedFile.new(:tempfile => tmp_img, :filename => File.basename(tmp_img)) 
else 
    image=nil 
end 
@your_model.image=image 
@your_model.save 
2

Tôi đang đối mặt với cùng một vấn đề. và vấn đề có thể là http đang chuyển hướng đến https. Vì vậy, tôi đã thay thế chúng bằng gsub như sau:

image.remote_image_url = remote_image_url.gsub('http://','https://') 
image.save! 

điều này hầu như có thể giải quyết được vấn đề.

0

Tôi đã gặp sự cố với remote_avatar_url không tải lên hình ảnh hoặc ném bất kỳ lỗi nào. Đối với tôi, theo như tôi có thể nói, đó là vì tôi đã đặt những điều sau đây trong mô hình của mình.

attr_accessor :remote_avatar_url 

Carrierwave bao gồm điều này cho bạn và mặc dù tôi không hiểu tại sao, tự mình cài đặt mọi thứ.

+0

Nếu bạn làm như vậy, bản chất, ghi đè khai báo của carrierwave về 'remote_avatar_url'. – counterbeing