12/08/2018, 13:46

Best Rails image uploader - Paperclip vs. Carrierwave vs. Refile

Chắc hẳn trong chúng ta khi làm dự án đều đã từng thực hiện các yêu cầu về upload tập tin và ảnh lên 1 ứng dụng Rails bằng tay, nhưng việc thiết lập bằng tay thường gặp không ít khó khăn và song song với đó là những tồn tại về nguy cơ bảo mật tiềm ẩn. Đó là lý do vì sao chúng ta lựa chọn Gem để ...

Chắc hẳn trong chúng ta khi làm dự án đều đã từng thực hiện các yêu cầu về upload tập tin và ảnh lên 1 ứng dụng Rails bằng tay, nhưng việc thiết lập bằng tay thường gặp không ít khó khăn và song song với đó là những tồn tại về nguy cơ bảo mật tiềm ẩn. Đó là lý do vì sao chúng ta lựa chọn Gem để giải quyết vấn đề này nhưng cũng thật khó khăn để lựa chọn xem gem nào là để phù hợp với dự án của mình rails_image_uploader.png

Ở đây mình sẽ giới thiệu 3 gem phổ biến nhất để upload tập tin và ảnh lên 1 ứng dụng Rails, đó là Paperclip, CarrierWave và Refile. Những gem này giúp upload tập tin và ảnh trên server nhưng chúng ta có thể mong đợi nhiều hơn trong việc custom file upload lên

  • Nạp bộ nhớ đệm: Nếu một form không thể xác nhận, thông thường chúng ta sẽ phải re-upload 1 lần nữa, điều này thật bất tiện. Do đó, tập tin bộ nhớ đệm là cần thiết để người dùng không phải re-upload, trên quan điểm UX và nó sẽ tiết kiệm băng thông.
  • Xử lý hình ảnh: Nó sẽ có thể thay đổi kích thước và cắt hình ảnh sang các định dạng khác nhau, và cho phép các nhà phát triển để lựa chọn thư viện mà họ sẽ sử dụng để làm như vậy.
  • Xử lý tập tin: Đây là một điều bắt buộc nếu bạn muốn trích xuất dữ liệu EXIF, tạo hình thu nhỏ cho các file PDF được tải lên, PSDs, DOCXs, XLSXs ...
  • CDN & dịch vụ lưu trữ hỗ trợ: Một điểm cộng lớn khi chúng ta muốn giữ cho băng thông đến các máy chủ của chúng ta càng thấp càng tốt và tránh mất dữ liệu do lỗi của máy chủ.
  • Tập tin trực tuyến: Giúp giữ mức tiêu thụ bộ nhớ máy chủ cấp thấp và giảm trong trình duyệt hiển thị trang lần.
  • On-the-fly processing: Về cơ bản, nó là khả năng xử lý hình ảnh và các tập tin trên một cơ sở cho mỗi yêu cầu. Một khái niệm thú vị mà cho phép các nhà phát triển để tạo ra nội dung thích nghi tốt hơn với các tình huống khác nhau.
  • Clean Code: Bất kỳ Gem nào mà bạn sử dụng sẽ không nên gây ảnh hưởng đến code của bạn và nó sẽ được dễ dàng để kiểm tra!

Giờ mình bắt đầu đi vào cụ thể từng gem

Paperclip

Paperclip có ưu điêm trong việc lưu tập tin bộ nhớ đệm và giữ code hết sức clena. Nhưng nó không phải là tốt trong việc maintain hay gọi lại các tập tin đã gửi đi

Cài đặt có thể được cấu hình trên toàn bộ hoặc trên 1 phần model, mà lần lượt đặt rất nhiều logic mà không liên quan đến model của bạn. Một hiệu ứng phụ của phương pháp này là các logic đưa lên không thể được kiểm tra độc lập với logic ở trong của model của bạn. Và về cơ bản nó không có khả năng xử lý tập tin. Có thể nói, dễ sử dụng và đơn giản là điểm mạnh của Paperclip.

Khi nào chúng ta nên sử dụng: Đó là trong trường hợp, nếu bạn chỉ cần tải lên một tập tin và quên nó đi. Nó cũng đủ tốt khi xây dựng các API đơn giản vì họ không cần tập tin bộ nhớ đệm hoặc chế biến. Nhưng nên tránh sử dụng nó trong các ứng dụng phức tạp hơn.

CarrierWave

CarrierWave theo cá nhân mình là tốt nhất để sử dụng trong các ứng dụng Rails

Nó lưu trữ tất cả các logic tải lên trong lớp tải lên, giữ mã của bạn sạch, rất dễ tái sử dụng và dễ dàng để kiểm tra! tổ chức mã này cho phép định nghĩa của bộ vi xử lý tập tin tùy chỉnh mà có thể sử dụng bất kỳ loại thư viện của bên thứ ba, có thể là một Gem hoặc lệnh shell.

Đó là hiệu quả nhất khi nói đến xử lý hình ảnh vì nó cho phép bạn chọn thứ tự các tập tin thay đổi.

Tập tin có thể được xử lý với nhiều bộ xử lý khác nhau và bộ vi xử lý mới có thể được xác định. Những bộ vi xử lý không chỉ có ích cho việc tạo ra hình ảnh của các kích cỡ khác nhau, nhưng họ cũng có thể được sử dụng để trích xuất dữ liệu EXIF, phân tích các file văn bản được tải lên, xác nhận các tập tin được tải lên ... Bạn chỉ được giới hạn bởi trí tưởng tượng của bạn.

Khi nào chúng ta nên sử dụng: CarrierWave nên được sử dụng trong các ứng dụng mà là 'hình ảnh nặng hoặc có logic kết hợp với các tập tin được tải lên.

Refile

Refile là Gem được giới thiệu mới nhất trong bộ 3 gem trên, có thể nói đó là một sự kế thừa 'over-engineered' của CarrierWave, và rất giống với Dragonfly. Nó cũng cố gắng để kết hợp các tính năng dễ sử dụng và đơn giản của Paperclip và sức mạnh của CarrierWave. Và rất dễ sử dụng, ít nhất là trong quan điểm của tôi.

Nó có khả năng xác định bộ xử lý tập tin tùy chỉnh, nhưng nó xử lý tất cả các tập tin on-the-fly. Một khái niệm thú vị vì nó làm cho các Gem về cơ bản không sử dụng được trong môi trường production mà không có một CDN và có thể là một lỗ hổng tiềm năng để tấn công DoS.

Nó gắn kết như một ứng dụng riêng biệt Sinatra trên đầu trang của ứng dụng, cho phép nó để truyền các file để cải thiện trang thời gian render và bảo tồn bộ nhớ máy chủ.

Customization và kiểm thử không phải là nhiệm vụ dễ dàng, hoặc như là ứng dụng không thể cho bạn biết nơi nó được lưu trữ các tập tin bạn đã cho nó. Mặt khác, nó thay đổi nhanh chóng và có rất nhiều người ủng hộ.

Khi nào chúng ta nên sử dụng: Theo ý kiến của tôi, on-the-fly xử lý hình ảnh nên tránh vì họ đã thừa hưởng vấn đề DoS, không có vấn đề nếu ứng dụng của bạn sử dụng một CDN hay không. Refile chỉ nên được sử dụng nếu bạn hoàn toàn cần on-the-fly thay đổi kích thước hình ảnh.

Overview

Feature Paperclip CarrierWave Refile
CDN support Minimal Ok Ok
File processing None Extensive Minimal
Image processing Yes Extensive Yes
Dynamic image resizing No No Yes
File streaming No No Yes
Customizability Simple Extensive None

Tóm lại

Lựa chọn giữa CarrierWave, Paperclip và Refile là không hề dễ dàng, nhưng cá nhân mình sẽ khuyên bạn lựa chọn CarrierWave. Nó là mạnh nhất và có thể nói là tùy biến của cả ba Gem. Nó giữ code của bạn được có 1 tổ chức rõ ràng và sạch sẽ, đồng thời cũng rất dễ dàng để kiểm tra hay maintain.

Refile còn mới và có vẻ chưa sẵn sàng được sử dụng trong thời gian này và tồn tại những vấn đề về DoS, còn Paperclip là khá đơn giản để sử dụng, và theo thị hiếu được dùng rất nhiều trong thời gian gần đây.

Trên đây chỉ là một số Ruby Gems về upload file & image mà tác giả thường hay dùng trong các dự án Ruby on Rails. Còn bạn, bạn có đang sử dụng Ruby on Rails? Những Ruby Gems mà bạn yêu thích và thường hay sử dụng là gì?

Bài viết được tham khảo và dịch từ: https://infinum.co/the-capsized-eight/articles/best-rails-image-uploader-paperclip-carrierwave-refile

0