2012-06-06 8 views
12

Tôi đang tìm một giải pháp để cung cấp cho người dùng khả năng tải lên nhiều hình ảnh thông qua một file_field. Tôi đã xem xét các tùy chọn như Tải lên và tải lên tệp Jquery như vậy nhưng vẫn chưa thấy được các ví dụ hay về giải pháp làm việc.Rails Paperclip & Tải lên nhiều tệp

Tôi đã có nhiều hình ảnh thiết lập,

has_attached_file :asset, 
        :styles => { :large => "640x480", :medium => "300x300", :thumb => "100x100" }, 
        :storage => :s3, 
        :s3_credentials => "#{Rails.root}/config/s3.yml", 
        :path => "/:contributor_id/:listing_name/:filename" 

Ngay bây giờ tôi đang hiển thị 5 file_fields cá nhân

def new 
    @listing = Listing.new 
    5.times {@listing.assets.build } 

    respond_to do |format| 
    format.html # new.html.erb 
    format.json { render json: @listing } 
    end 
end 

Tôi muốn có

<%= f.file_field :asset, :multiple => true %> 

đó cho phép người sử dụng để chọn nhiều tệp trong trình duyệt tệp của họ. Nhưng làm thế nào tôi có thể xử lý chúng với một mô hình lồng nhau? Và tải chúng lên.

Trả lời

34

Vì vậy, có một số vấn đề ở đây.

Đầu tiên, phương pháp has_attached_file của Paperclip không phải là kết hợp với nhiều tệp. Có vẻ như bạn đang cố gắng tạo "nội dung" như thể đó là một liên kết Rails. Tất cả các Paperclip không được đặt một vài lĩnh vực vào bảng của bạn để lưu trữ một số siêu dữ liệu về tập tin và bạn nhận được một tập tin đính kèm theo tuyên bố của has_attached_file. Nếu bạn muốn đính kèm 5 tệp, bạn sẽ cần thực hiện một số việc như:

has_attached_file :asset1 
has_attached_file :asset2 
has_attached_file :asset3 
has_attached_file :asset4 
has_attached_file :asset5 

Hoặc, bạn có thể tạo một mô hình khác để lưu trữ tệp. Ví dụ:

class Listing < ActiveRecord::Base 
    has_many :assets 
end 

class Asset < ActiveRecord::Base 
    belongs_to :listing 
    has_attached_file :picture 
end 

Bằng cách đó, bạn có thể có nhiều nội dung được đính kèm với một danh sách (bạn không nói đối tượng gốc là cái gì tôi gọi là "danh sách").

Thứ hai, không có thứ gì như tải lên nhiều tệp trong HTML (và, như vậy, phương thức file_field không tham số :multiple => true. Bạn sẽ phải sử dụng thứ gì đó ngoài xử lý biểu mẫu dựng sẵn Rails nếu Uploadify là một lựa chọn phong nha (mà tôi đã sử dụng trước đây) Có một viên ngọc sẽ chuyển đổi các lĩnh vực tập tin để sử dụng uploadify (và sẽ hỗ trợ cú pháp :multiple => true mà bạn muốn): https://github.com/mateomurphy/uploadify_rails3/wiki. không thể xác minh cho nó tốt như thế nào

Lời khuyên của tôi là bắt đầu từng bước. Tải lên qua Flash to Rails có thể là một quá trình phức tạp liên quan đến thẻ meta CSRF và các trường khác trong biểu mẫu của bạn. Bắt đầu bằng cách tạo biểu mẫu cho phép người dùng tải lên một tệp và lưu trữ nó thông qua Paperclip. Sau đó, có thể ngắt tuyên bố has_attached_file thành một mô hình khác để bạn có thể có 1 hoặc nhiều tệp được liên kết với một mô hình (như được hiển thị trong khối mã nhiều mô hình ở trên). Sau đó thử thêm Uploadify hoặc một giải pháp thay thế khác. Ernie Miller có một hướng dẫn phong nha về tích hợp Uploadify: http://erniemiller.org/2010/07/09/uploadify-and-rails-3/.

Để bắt đầu, hãy nhớ rằng has_attached_file chỉ có thể đính kèm một tệp. Khi bạn thử gọi số @listing.assets, không có "nội dung". Có một tài sản. Bạn cần tự tạo một mô hình riêng và sử dụng các liên kết của Rails nếu bạn muốn nhiều tệp.

+0

Tôi đã tạo một mô hình khác được gọi là "Liệt kê". Danh sách has_many nội dung. Tôi đã có thể tải lên nhiều nội dung, chỉ cần không thông qua một trường "Chọn tệp" duy nhất. nếu có ai có bất kỳ ví dụ điển hình nào bằng cách sử dụng uploadify sẽ tuyệt vời. Tôi không chắc chắn làm thế nào để làm nền JS để xử lý mỗi hình ảnh và POST chúng vào máy chủ đúng cách. – kcollignon

+3

Bạn có thể thêm ': multiple =>" multiple "' vào 'file_field', cho phép chọn nhiều tệp từ một trường nhập tệp html (ít nhất là trong Chrome). Tôi chưa giải quyết được vấn đề quản lý các tải lên này đúng cách, nhưng tôi biết rằng thông số bài đăng bao gồm một mảng gồm nhiều tệp bạn đã chọn và tải lên. –

+0

Và bạn cũng phải thêm ': html => {: multipart =>: true}' vào 'form_for' của bạn. –

2

Câu trả lời được chấp nhận cho biết không có nội dung nào tải lên nhiều tệp bằng HTML.

<%= f.file_field :files, multiple: true %> 

Điều này cho phép bạn chọn nhiều hình ảnh và gửi chúng dưới dạng mảng.

Nếu bạn có mối quan hệ Dog has_many ImagesImage has_attachment :file, làm được điều này để có được nhiều hình ảnh để tải lên cùng một lúc:

Trong html.erb

<%= form_for @dog, html: { multipart: true } do |f| %> 
    <%= f.file_field :files, accept: 'image/png,image/jpeg,image/gif', multiple: true %> 
<%= end %> 

của bạn Trong điều khiển của bạn

def dog_params 
    params.require(:dog).permit files: [] 
end 

Trong mô hình Chó của bạn

def files=(array = []) 
    array.each do |f| 
    images.create file: f 
    end 
end 

Giả sử bạn đã có thể tải lên một hình ảnh nhưng muốn nâng cấp lên nhiều hình ảnh cùng một lúc. Lưu ý rằng thời gian chờ đợi sẽ tăng lên.

Để giúp giảm thời gian chờ, hãy peep số post về câu hỏi này liên quan đến tải lên tốc độ.