Cách Ruby on Rails để lưu hình ảnh là gì?


9

Tôi phát triển trên iOS và tôi đang chuyển từ phụ trợ PHP sang Ruby on Rails. Định dạng trao đổi là JSON .

Một tìm kiếm nhanh của Google về 'lưu hình ảnh trong Rails' có gần như mọi kết quả nói về việc lưu dữ liệu hình ảnh dưới dạng các đốm màu vào cơ sở dữ liệu. Tôi có thể nhầm, nhưng tôi có ấn tượng rằng việc lưu dữ liệu hình ảnh trong cơ sở dữ liệu là một sự lãng phí rất lớn về thời gian và không gian (trái ngược với việc lưu một liên kết đến vị trí tệp ('/img/subcat/4656.png') .

Trong PHP, việc nhận dữ liệu, tạo tên tệp, lưu tệp đó vào đĩa và cập nhật cơ sở dữ liệu với vị trí của hình ảnh trên đĩa là khá chuẩn. Điều này có giống với Ruby on Rails không, hay có một số chức năng hình ảnh ActiveRecord tích hợp mà tôi không biết?


1
Tôi đã vấp vào PaperClip , dường như khá gần với những gì tôi muốn. Vẫn sẽ đánh giá cao lời khuyên từ dân gian Rails có kinh nghiệm về cách đối phó với việc phục vụ và nhận hàng ngàn hình ảnh ở tốc độ tối ưu.
người dùng

1
Bạn có biết rằng hình ảnh sẽ chiếm nhiều dung lượng trên db hoặc trên đĩa không? Từ cảm giác ruột thịt, tôi muốn nói rằng Rails lưu trữ trên cơ sở dữ liệu vì nó không dựa vào apache nhiều như PHP để xử lý bộ đệm. Điều đó có thể hoàn toàn sai mặc dù.
Florian Margaine

2
Vâng, tôi không nghĩ rằng dữ liệu hình ảnh sẽ bị thao túng bởi vị trí lưu trữ. Rails có thể khác nhau, nhưng một số thành viên SO đáng tin cậy dường như nghiêng về đường dẫn tệp trong cơ sở dữ liệu. Thêm vào đó, tôi nghĩ rằng kiến ​​thức thông thường là cơ sở dữ liệu rất khó mở rộng - vì vậy việc lưu trữ hàng tấn dữ liệu hình ảnh trong cơ sở dữ liệu chắc chắn sẽ không làm cho điều đó trở nên dễ dàng hơn.
người dùng

Câu trả lời:


4

Những gì tôi đã làm trong quá khứ là sử dụng PaperClip với Amazon S3CloudFront CDN để phân phối nhanh hơn. PaperClip hỗ trợ lưu trữ S3 rất độc đáo: xem tài liệu của họ để biết các tùy chọn cấu hình lưu trữ S3 .

  1. Thiết lập phân phối CloudFront để chuyển tiếp các yêu cầu hình ảnh đến nhóm S3 của bạn và các yêu cầu khác về tài sản tĩnh cho ứng dụng Ruby on Rails của bạn (ngoài ra, bạn cũng có thể tải chúng lên S3, nhưng nằm ngoài phạm vi của câu hỏi này).
  2. CNAME một tên miền bạn kiểm soát (chẳng hạn như nội dung.example.com) để trỏ đến bản phân phối CloudFront của bạn.
  3. Trong cấu hình PaperClip, đặt s3_host_alias: assets.example.com. Điều này sẽ khiến các URL được tạo thành tài nguyên hình ảnh đã lưu để sử dụng máy chủ phân phối CloudFront của bạn.
  4. Trong cấu hình Ruby on Rails, bạn có thể thực hiện config.action_controller.asset_host = http://assets.example.com. Các URL tài sản của Ruby on Rails sau đó cũng sẽ sử dụng bản phân phối CloudFront của bạn, để lưu trữ / phân phối nhanh hơn.

Điều đó khá sơ sài, nhưng nó hy vọng sẽ chỉ cho bạn hướng đi của một số tài nguyên hữu ích. Tất nhiên, đó chỉ là một giải pháp, nhưng đó là một giải pháp phù hợp với tôi trong tình huống tôi phải xử lý hàng trăm ngàn tệp đính kèm hình ảnh trong cơ sở dữ liệu.

(Là một bước tiến có thể là có thể không cần thiết hoặc hữu ích cho trường hợp của bạn, bạn cũng có thể thiết lập nhiều CNAME để phân phối CloudFront của bạn, chẳng hạn như assets0.example.comassets1.example.com. Cả hai chiếc kẹp giấy s3_host_aliasaction_controller.asset_hostsau đó có thể mất lambdas mà sẽ cho phép bạn deterministically (dựa trên nội dung) tạo các URL sử dụng các máy chủ khác nhau, để song song tốt hơn nếu bạn đang tải xuống một loạt chúng trên cùng một trang, vì các trình duyệt sẽ giới hạn các kết nối đồng thời tối đa cho cùng một máy chủ.)


3

Tôi đã thử một vài viên đá quý, nhưng bây giờ tôi đang sử dụng FineUploader cùng với PaperClip

FineUploader xử lý rất nhiều GUI cho bạn, ví dụ như tiến trình tải lên, kéo và thả và nhiều tệp tải lên, v.v. Tôi đang sử dụng PaperClip vì tôi muốn lưu trữ hình ảnh trên máy chủ của mình thay vì trên S3.

Những gì chúng ta thường làm là tìm kiếm một giải pháp cấu hình sẵn có ổn định thay vì tạo lại các thứ từ đầu. Với PaperClip, tôi lưu trữ hình ảnh và với StateMachine, tôi thực hiện chuyển đổi trên hình ảnh và đưa chúng vào danh mục dựa trên tên tệp. Tôi đã có cùng một câu hỏi mà bạn có, và đây là giải pháp làm việc tốt nhất của tôi, đó là lý do tại sao tôi chia sẻ nó.


2
Đây chỉ là một khuyến nghị cho một gói bên ngoài để thực hiện công việc; OP đã yêu cầu các nhà phát triển Ruby on Rails thường làm gì để lưu trữ hình ảnh chứ không phải khuyến nghị. Mặc dù đây có thể là một ví dụ về cách một gói thực hiện, nhưng điều này không thực sự trả lời câu hỏi.
Martijn Pieters

Thật. Những gì chúng ta thường làm là tìm kiếm một giải pháp cấu hình sẵn có ổn định thay vì tạo lại các thứ từ đầu. Với PaperClip, tôi lưu trữ hình ảnh và với StateMachine, tôi thực hiện chuyển đổi trên hình ảnh và đưa chúng vào danh mục dựa trên tên tệp. Tôi đã có cùng một câu hỏi mà OP có, và đây là giải pháp làm việc tốt nhất của tôi, đó là lý do tại sao tôi chia sẻ nó ..
JeroenKnoops
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.