2012-06-13 49 views
12

Tôi đang sử dụng ruby ​​1.9.2 cùng với Rails 3.1.4 và Paperclip 2.4.5.Phương thức mở của Ruby mở-uri mất hình ảnh mở rộng tập tin

Sự cố của tôi đang cố gắng lưu tệp đính kèm kẹp giấy từ URI mất phần mở rộng tệp và lưu tệp mà không có sự cố xảy ra với những thứ như hộp ưa thích yêu cầu tiện ích mở rộng.

Một số mã ví dụ:

uri = "http://featherfiles.aviary.com/2012-06-13/bbe5f0de1/0c5a672b88ea47ecb4631ac173e27430.png" 
open(uri) 
#=> #<File:/var/folders/zc/d69gxhzx10x_bvjrkqgyjgxr0000gn/T/open-uri20120613-27204-i6cldv> 

Vì không có phần mở rộng vào file tạm thời kẹp giấy được lưu tập tin mà không có một kết quả trong vấn đề này.

Có ai gặp sự cố này không? Tôi đã nhìn thấy nhiều câu trả lời về cách sử dụng kẹp giấy để lưu trữ hình ảnh từ một URI nhưng dường như không giải quyết được cùng một vấn đề mà chúng tôi đang chạy

+1

Tôi đang phải đối mặt với vấn đề này là tốt. – jfedick

Trả lời

0

Tôi không chắc chắn điều này có giúp ích cho bạn hay không. dự án.

Sự cố không được gây ra bởi Paperclip cũng không phải open-uri, nhưng người nhận tệp kẹp giấy (trong trường hợp của tôi là Spree Commerce). Kiểm tra xem bạn có gán đối tượng kẹp giấy cho đúng đối tượng không và đối tượng đó đang được diễn giải chính xác.

Việc sửa chữa mà làm việc đối với tôi là để thay đổi:

@product.images << Spree::Image.create({ 
    :attachment => open(image_url) 
}, :without_protection => true) 

để

@product.master.images << Spree::Image.create({ 
    :attachment => open(image_url) 
}, :without_protection => true) 

Chúc may mắn với vấn đề của bạn

-1

Vâng, đó là một vấn đề nhưng chúng ta có thể làm được việc này với fancybox.

Trong thẻ liên kết (đối với hình ảnh) thêm :type => 'image'

- @images.each do |image| 
= link_to image_tag(image.attachment.url), image.attachment.url, class: "fancybox", type: 'image' 

Bằng cách xác định 'type', Fancybox ghi đè kiểu như hình ảnh

https://groups.google.com/forum/?fromgroups=#!topic/fancybox/QgjquBCLynU

+1

điều này không thực sự nhận được xung quanh nhiều và thêm một yêu cầu cho fancybox để hiển thị hình ảnh – Jimmy

0

Bạn đã inclued các: phần mở rộng trong bạn tùy chọn đường dẫn/url?

Ví dụ:

has_attached_file :image, 
    ... 
    :url => '/images/highlights/:id_partition/:style_:id.:extension', 
    :path => ':rails_root/files/images/highlights/:id_partition/:style_:id.:extension' 

Điều này có lẽ sẽ giải quyết vấn đề của bạn. Bạn có thể buộc một tiện ích mở rộng ở đó, nhưng tôi không nghĩ rằng đó là khuyến nghị.

3

Không sử dụng tệp tạm thời! Nó có sẵn như một trình giữ chỗ khi tệp được đọc từ cổng và phải được coi là tài nguyên riêng cho OpenURI. Thay vào đó, hãy sử dụng open(url).read và làm việc với nội dung kết quả bằng cách lưu nó.

làm cái gì đó như:

require 'uri' 
require 'open-uri' 

url = 'http://www.iana.org/domains/example/index.html' 
filename = File.basename(URI.parse(url).path) 
File.open(filename, 'wb') do |fo| 
    fo.write(open(url).read) 
end 

Tạm thời spooling vào đĩa trong một cuộc phẫu thuật, đặc biệt là một mạng lưới hoạt động, là phổ biến. Khi nội dung của tệp đã được tích lũy, sau đó nó có sẵn để được chuyển cho ứng dụng.read đang chặn, vì vậy mã của bạn sẽ dừng ở đó cho đến khi tệp được trả lại cho bạn. Sau đó, bạn có thể chơi với nó.

2

Tiện ích mở rộng không quan trọng đối với tệp tạm thời, nhưng nếu bạn muốn sử dụng tệp này trong mã hoặc lưu vào một địa điểm khác. Bạn có thể làm điều đó:

temp_file = open(params[:url]) 
def temp_file.original_filename; File.basename(base_uri.path); end 

Bây giờ, bạn có thể lưu tệp tạm thời này vào không gian vĩnh viễn hoặc sử dụng nó trong mã; Tên tệp gốc sẽ được sử dụng tự động.

+0

Không hoạt động. Một số phép thuật bổ sung có vẻ là cần thiết để làm cho 'base_uri' có thể truy cập được vào phương thức original_filename đã được định nghĩa ở đây, fyi. – ericpeters0n

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