2011-01-13 36 views
14

Tôi gặp sự cố khi tải tệp lên. Tôi muốn cho phép người dùng tải lên các tệp mà hệ thống cho phép ...Giới hạn việc tải tệp lên một số tiện ích mở rộng tệp

Ví dụ: tôi cho phép các tệp có phần mở rộng là * .jpg để người dùng tải lên. Vì vậy, trong cửa sổ chọn tệp, họ chỉ phải xem các tệp có phần mở rộng là jpg.

Tôi làm cách nào để có được điều này trong RoR?

Trả lời

8

Câu trả lời cho câu hỏi này có lẽ liên quan nhiều hơn đến việc tải lên html hơn đường ray.

Khi bạn muốn tải lên tệp, bạn thường làm một đầu vào với loại = "tệp".

Điều này có thể được thực hiện trong Rails bằng cách sử dụng file_field_tag helper. Nó sẽ tạo ra một đầu vào với type = "file" mà cũng có thể có thuộc tính chấp nhận, nhưng bạn thực sự không thể sử dụng nó bởi vì nó không thực sự có bất kỳ hiệu ứng rõ ràng nào. Thuộc tính này chấp nhận các loại MIME, không phải các phần mở rộng và hầu hết các trình duyệt thậm chí không sử dụng nó.

Điều tốt nhất bạn có thể làm là có thể có javascript kiểm tra phần mở rộng tệp trước khi tải lên (sau khi bạn chọn tệp từ hộp thoại). Đọc thêm về nó trong this question.

Vấn đề là bạn không thể buộc hệ điều hành chỉ hiển thị cho bạn các tiện ích mở rộng tệp mà bạn muốn. Bạn có thể xác nhận các phần mở rộng bằng cách sử dụng JS ví dụ, trước khi tải lên, hoặc kiểm tra các nội dung của file sau khi tải lên, phía máy chủ

+1

Sử dụng Javascript không phải là ý tưởng hay vì nó có thể dễ dàng bị phá vỡ. Tốt hơn nên thực hiện xác thực phía máy chủ, ví dụ: được hỗ trợ bởi Paperclip. –

+3

Tôi không đề xuất sử dụng javascript để xác thực, nhưng như là một hình thức duy nhất (tôi có nghĩa là .. tại sao để cho ai đó tải lên một hình ảnh với một phần mở rộng sai). Nếu người dùng tải lên tệp, ngay cả với phần mở rộng được yêu cầu, rõ ràng là nó phải được kiểm tra phía máy chủ. nhưng đó không phải là vấn đề ở đây. câu hỏi là nếu nó có thể được xác nhận trước khi tải lên (có lẽ để tiết kiệm thời gian để tải lên một cái gì đó không hợp lệ. ít nhất đó là cách tôi nhìn thấy nó) –

7

Trước tiên, bạn có thể sử dụng phương pháp extname để xác thực tệp bạn đang lưu. http://apidock.com/ruby/File/extname/class

Thứ hai, tôi sử dụng đá quý Paperclip https://github.com/thoughtbot/paperclip để tải lên tệp. Có phương thức validate_attachment_content_type để xác thực các tiện ích mở rộng: http://rdoc.info/gems/paperclip/2.3.8/Paperclip/ClassMethods#validates_attachment_content_type-instance_method

13

Với HTML5, bạn có thể sử dụng: chấp nhận để hạn chế mime-loại, như vậy:

<%= file_field_tag :csv_file, :accept => 'text/csv' %> 
+0

"csv_file" là gì? Được xây dựng trong? – Jubl

+1

@ Jubl no thats tên của trường. Hãy xem API http://apidock.com/rails/ActionView/Helpers/FormTagHelper/file_field_tag ​​ – Roger

+0

Bạn sẽ chấp nhận nhiều tiện ích mở rộng tệp như thế nào? – Ctpelnar1988

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