2013-02-05 45 views
8

Gần đây tôi đã bắt đầu phát triển một trang web khá lớn. Trên trang web tôi muốn cho phép người dùng tải lên các tác phẩm mẫu của họ. Chúng tôi khá hạn chế vào lúc này nên các hình ảnh sẽ được lưu trữ trên máy chủ của chúng tôi.Laravel thư viện hình ảnh

Tôi có chút khó khăn với logic. Vì vậy, logic của tôi sẽ là điều này.

tài tạo ra một thư mục với một tên được lưu trữ trong cơ sở dữ liệu với users id gắn liền với nó

bảng thư mục

Hàng

id | folder  | user_id 
1 | Some folder | 1 
2 | New folder | 4 
3 | Nother folder | 7 

Images bảng

Hàng

id | image_name  | folder_id | 
1 | image1.jpg  | 1 
2 | image2.jpg  | 1 
3 | image3.jpg  | 1 
4 | image4.jpg  | 2 
5 | image5.jpg  | 2 
6 | image6.jpg  | 2 

Quan hệ

class Folder extends Eloquent 
{ 
    public function images() 
    { 
     return static::has_many('Images'); 
    } 
} 

class Image extends Eloquent 
{ 
    public function folder() 
    { 
     return static::belongs_to('Folder'); 
    } 
} 

cấu trúc thư mục trên máy chủ

- samples 
    -user_id 
    - folder_id 
    - image1 
    - image2 
    - image3 

vì vậy khi bạn có thể thấy, người sử dụng tạo ra một thư mục, sau khi thư mục được tạo ra, user uploades tên hình ảnh trong cơ sở dữ liệu với số folders id và hiển thị hình ảnh sẽ là cách mà descr ibe ở trên với realation.

Vì vậy, câu hỏi của tôi.

  • Đây có phải là một logic tốt theo ý kiến ​​của bạn
  • này vấn đề về chì trong tương lai
  • những gì bạn woud cung cấp cho chức năng này

Và những gì tôi thiêng liêng nhất của thể là 2 thứ .

Tôi nghĩ điều này sẽ dẫn đến một cơ sở dữ liệu khổng lồ, thứ hai là id's, sau thời gian x khi có nhiều người dùng hơn, id's sẽ tăng và tôi biết điều này nghe có vẻ lạ, nhưng vì nhiều người dùng sẽ tải lên hình ảnh sẽ dẫn đến id lớn, những gì tôi có nghĩa là bởi điều này nó sẽ có thể đạt đến hàng triệu, là có một cách để giải quyết vấn đề này?

Cảm ơn sự giúp đỡ

+0

Tôi có cùng bảng nhưng tôi muốn bất kỳ người dùng đăng nhập nào cũng có thể xem tất cả hình ảnh của những người dùng khác nhưng có thể cập nhật (chỉnh sửa) và xóa chỉ riêng của họ.Chỉ dẫn tôi nếu có ai có giải pháp. ở đây. – Raham

Trả lời

19

Ok - cho phép chia nhỏ thành một vài câu trả lời phụ;

Câu hỏi:

- Is this a good logic in your opinion 
- Can this lead problems in the future 
- What would you offer for this functionality 

Trả lời:

Logic dường như âm thanh - nhưng tôi tò mò nơi bạn sẽ lưu trữ những hình ảnh?Bên trong public_html - hoặc bên ngoài root web? Nếu bạn có các hình ảnh bên trong public_html - và cho phép trình duyệt truy cập chúng trực tiếp, nó sẽ cho phép người dùng 'đoán' các thư mục người dùng khác và truy cập chúng. Bạn cần lưu trữ dữ liệu một cách an toàn.

Để tạo hình ảnh bên ngoài webroot và đảm bảo chỉ những người dùng được ủy quyền mới có thể truy cập chúng - bạn nên sử dụng readfile(). Một cái gì đó như thế này sẽ làm các trick

function user_file($file_name = "") 
{ 
    if ($file_name) 
    { 
     // Ensure no funny business names to prevent directory transversal etc. 
     $file_name = str_replace ('..', '', $file_name); 
     $file_name = str_replace ('/', '', $file_name); 

     // now do the logic to check user is logged in 
     if (Auth::check()) 
     { 
       // Serve file via readfile() - we hard code the user_ID - so they 
       // can only get to their own images 
       readfile('../your_app/samples/'.Auth::user()->id.'/'.$file); 
     } 
    } 
} 

Câu hỏi:

Tôi nghĩ rằng điều này sẽ dẫn đến một cơ sở dữ liệu khổng lồ, thứ hai là của id, sau một thời gian x khi sẽ có nhiều người sử dụng, id của sẽ tăng lên, và tôi biết điều này sẽ âm thanh lạ, nhưng vì nhiều người dùng sẽ tải lên hình ảnh sẽ dẫn đến id lớn, ý tôi là điều này có thể sẽ đạt đến hàng triệu

Trả lời:

Theo mySQL features page:

Chúng tôi sử dụng MySQL Server với cơ sở dữ liệu có chứa 50 triệu hồ sơ. Chúng tôi cũng biết những người dùng sử dụng MySQL Server với 200.000 bảng và khoảng 5.000.000.000 hàng.

Vì vậy, đó là 5 tỷ hàng. Bạn có thể sẽ nhận được một vài triệu. Vì vậy, bạn được an toàn ở đây (tùy thuộc vào phần cứng của bạn).

Câu hỏi:

... nhưng kể từ khi nhiều người dùng sẽ tải lên hình ảnh sẽ dẫn đến id khổng lồ, những gì tôi có nghĩa là bằng cách này nó sẽ có thể đạt tới hàng triệu, là có một cách để giải quyết vấn đề này?

Trả lời:

Nếu bạn không muốn lưu trữ hàng triệu bản ghi, và lo lắng của bạn về hiệu suất, một lựa chọn là giữ bảng thư mục, nhưng thả các bảng hình ảnh. Thay vào đó, bạn có thể sử dụng scandir() trên thư mục - và nhận PHP để truy xuất tên tệp từ chính thư mục đó. Sau đó, bạn không có nhiều chi phí.

<?php 
    $list_of_user_files = scandir("$user_id/$folder_id"); 
    foreach ($list_of_user_files as $file) { 
      echo "File: $file <br>"; 
    } 
?> 
+0

cảm ơn bạn đã trả lời chi tiết, hình ảnh sẽ được lưu trữ trong thư mục lưu trữ, và có tôi biết, bảo vệ cho điều đó được thực hiện chăm sóc :) – Side

1

Biến tần lưu trữ bảng thư mục và sử dụng chức năng scandir là thủ tục đứng. Và cho phép php lấy lại tên tệp từ thư mục. Nếu bạn có một số tệp thì hãy thử phân loại chúng theo thứ tự năm và tháng như trong wordpress. Giống như

2012 
    01 
    02 
    03 
2013 
    01 
    02 
    03 

vv bên trong id thư mục. Vì vậy, tổng số hình ảnh trong một thư mục sẽ tương đối ít hơn.

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