2017-05-05 23 views
8

Tôi đang làm việc trên một dự án mà người dùng tham gia "luồng". Trong thiết lập dòng, người đang tạo ra luồng (tác giả dòng) có thể chọn một trong hai:Đường ray: Cách tốt nhất để cho phép người dùng tải hình ảnh lên thư mục được liên kết Dropbox hoặc bộ nhớ "của chúng tôi" trên Amazon S3

  1. Tải lên tất cả ảnh đã được thêm vào dòng của các thành viên với giải pháp lưu trữ của chúng tôi (S3)
  2. Tải lên tất cả ảnh đã được thêm cho luồng dữ liệu do các thành viên để riêng Dropbox đã xác thực thư mục tác giả luồng của

Trong tương lai tôi muốn thêm các nhà cung cấp lưu trữ hơn (chẳng hạn như Drive, Onesky vv)

Có một vài câu hỏi khác nhau mà tôi có liên quan đến cách giải quyết vấn đề này.

  1. Cấu trúc nên có trong cơ sở dữ liệu cho ảnh? Tôi hiện chỉ có photo_url, nhưng điều đó sẽ không dễ dàng để quản lý từ góc độ dữ liệu với url được ký trước và khi có nhiều cách khác nhau, ảnh có thể được tải lên (s3, dropbox, v.v.)
  2. Mã thông báo truy cập như thế nào cho mỗi nhà cung cấp lưu trữ được lưu trữ? Hãy nhớ rằng access_token của người tạo luồng sẽ được lưu trữ và mọi người trên luồng sẽ chia sẻ mã thông báo đó khi tải ảnh lên
  3. Tôi sẽ thêm iOS và máy khách web trong tương lai sẽ thực hiện tải lên trực tiếp nhà cung cấp bộ nhớ và bỏ qua máy chủ để tránh tải nặng trên máy chủ
+0

Câu hỏi này quá lớn. Tốt nhất là chia chúng thành những câu hỏi nhỏ hơn. –

Trả lời

1

Theo như lưu trữ cơ sở dữ liệu, ứng dụng của bạn nên ra lệnh cấu trúc dựa trên giao diện đó bạn trình bày cả cho người dùng và luồng. Nếu bạn có người dùng tải ảnh lên và họ không chọn URI và bạn không có bất kỳ phân cấp nào trong luồng, thì tôi khuyên bạn chỉ nên lưu trữ ID và luồng_id trong bảng ảnh chính của bạn.

Vì vậy, ở mức tối thiểu bạn có thể có một cái gì đó trông như

create table photos(id integer primary key, stream_id integer references streams(id) not null); 

Nhưng có lẽ bạn cũng muốn mô tả và các thông tin khác mà không phụ thuộc vào dung lượng lưu trữ.

Bảng luồng sẽ có tất cả thông tin chung về luồng, nhưng sẽ có một polymorphic association cho một lớp phụ thuộc vào loại luồng. Vì vậy, bạn có thể sử dụng liên kết đó để có được một thể hiện của S3Stream hoặc DropBoxStream dựa trên những gì luồng thực tế đã được sử dụng. Ví dụ đó (cũng là tài nguyên ActiveRecord) có thể lưu trữ khóa truy cập, và đối với những thứ như dropbox, đường dẫn đến thư mục vv. Ngoài ra, trường hợp đó có thể cung cấp các phương thức để xây dựng một URI cho đối tượng Photo của bạn. Nếu một công nghệ cụ thể cần lưu trữ các URI đã ký, thì đối tượng S3Stream có thể tham chiếu đến mô hình S3SignedUrl nơi các URI được ký. Nếu nó chỉ ra rằng mã URL đã ký là tương tự giữa DropBox và S3, thì có lẽ bạn có một mô hình SignedUrl duy nhất.

Khi bạn thiết kế khách hàng ios và android, điều quan trọng là họ không được cấp quyền truy cập vào mã thông báo truy cập của chủ sở hữu luồng. Thay vào đó, bạn sẽ cần thực hiện tất cả việc ký bên trong ứng dụng máy chủ của mình. Bạn sẽ không muốn một sự thỏa hiệp của một thiết bị dẫn đến việc phơi bày mã thông báo truy cập tạo ra các vấn đề về thanh toán cũng như các tiếp xúc riêng tư. Hy vọng điều này sẽ hữu ích.

0

chúng tôi thiết lập nhiều ứng dụng đường ray với các loại tệp lưu trữ khác nhau phía sau nó.

  1. Có, chỉ một url không thể quản lý được trong tương lai. Để tiết kiệm rất nhiều thời gian, bạn có thể sử dụng đá quý như carrierwave hoặc paperclip. Họ xử lý tất cả việc tạo hình thu nhỏ và xác thực tệp. Một cách tiếp cận là, bạn có thể tải tệp từ khách hàng trực tiếp lên S3 hoặc Dropbox lên thư mục tmp và chỉ nói cho ứng dụng Rails của bạn "Hey, đây là url của tệp tải lên mới" và kẹp giấy và carrierwave sẽ xử lý tạo hình thu nhỏ và lưu trữ. (Example for paperclip)

  2. Không biết chính xác cách thức hoạt động luồng của mình, vì vậy tôi có thể không đưa ra một câu trả lời tốt để này -.-

  3. Với sự thiết lập tôi đã đề cập trong 1. Bạn nên tải lên hình thành các khách hàng khác nhau của bạn trực tiếp đến S3 hoặc Dropbox vv và sau khi tải lên, máy khách sẽ nói với Rails Backend rằng nó sẽ nhập tệp từ url đó. (Và trước khi kẹp giấy hoặc kết thúc carrierwave chế biến của họ, bạn có thể sử dụng url tmp từ tập tin để hiển thị một cái gì đó trực tiếp trong luồng của mình)

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