2012-01-19 97 views
34

Tôi không biết làm thế nào các trang web lớn lưu hình ảnh trên máy chủ của họ. Bất kỳ ai có thể cho tôi biết làm thế nào để họ lưu hình ảnh được tải lên bởi người dùng trong cơ sở dữ liệu của họ?Cách tốt nhất để tải lên và lưu trữ hình ảnh trên trang web là gì?

Tôi đã suy nghĩ, có lẽ họ sẽ chỉ lưu tệp (hình ảnh) trong một số đường dẫn và chỉ lưu đường dẫn đó trong databse là đúng không?

Nhưng tôi muốn làm theo cách này. Thê nay đung không? Ví dụ: một trang web có tên là www.photos.com. Khi người dùng tải ảnh lên, tôi sẽ tạo một thư mục tên người dùng và lưu các ảnh đó vào thư mục đó.

Tôi tin rằng chúng tôi có thể tạo thư mục bằng cách sử dụng php file concepts. Vì vậy, khi một người dùng mới tải lên hình ảnh hoặc tệp của anh ấy, tôi muốn tạo một thư mục có tên của anh ấy.

Ví dụ: nếu tên người dùng là john, tôi sẽ tạo một thư mục như thế này trên photos.com www.photos.com/john/ và sau đó lưu tất cả ảnh của anh ấy vào thư mục này khi anh ấy tải ảnh lên. Đây có phải là cách đúng để làm điều này không?

Tôi không có ai ở đây có kiến ​​thức tốt về việc lưu tệp vào máy chủ, vì vậy hãy cho tôi biết cách thực hiện việc này? Tôi muốn làm điều đó một cách chính xác và an toàn.

+2

@AdrianCornish Bạn có thể cho tôi biết ý của bạn là gì bởi những gì bạn đã thử? Tôi không yêu cầu bạn viết mã cho tôi, tôi chỉ muốn thuật toán hoặc quá trình mà hầu hết mọi người theo dõi để tôi có thể tiếp tục nếu tôi biết phải làm gì – niko

+0

Một lần nữa bạn đã thử những gì? Bạn có thể lưu một đường dẫn đến tệp, bạn có thể lưu trữ dữ liệu nhị phân trong cơ sở dữ liệu. Câu hỏi thực tế của bạn là gì? –

+0

Câu hỏi của bạn bị nói xấu - bạn đang hỏi cách tải ảnh lên. Không phải cách lưu trữ hình ảnh tải lên trang web của bạn.Ngoài ra, bạn đang làm gì để bảo vệ người dùng chống lại mã độc hại tải lên, hình ảnh có tải trọng ẩn, ngăn mọi người chỉ lấy tất cả hình ảnh của bạn từ url có thể lập chỉ mục –

Trả lời

125

Tất cả các trang web lớn không lưu ảnh vào cơ sở dữ liệu chúng lưu trữ chúng trong đĩa. Chúng lưu một tham chiếu đến vị trí của hình ảnh trong một bảng. Và sau đó liên kết từ đó.

Tại sao? Hiệu suất.

Kéo nội dung nặng từ cơ sở dữ liệu là một nút cổ chai hiệu suất rất lớn. Và cơ sở dữ liệu không quy mô theo chiều ngang mà tốt, vì vậy nó sẽ có nghĩa là ngay cả một vấn đề lớn hơn. Tất cả các trang web lớn sử dụng trang trại nội dung tĩnh để xử lý nội dung tĩnh như hình ảnh. Đó là những máy chủ không quan tâm đến danh tính của bạn.

Làm cách nào để giữ ảnh thật sự riêng tư mà bạn có thể yêu cầu? Họ không.

Liên kết của hình ảnh là, chính nó, địa chỉ và mật khẩu. Hãy lấy Facebook làm ví dụ. Nếu tôi lưu trữ một hình ảnh riêng tư trên tài khoản của tôi, bạn sẽ không thể mở nó. Nhưng, miễn là bạn có địa chỉ chính xác bạn có thể.

This picture is private. Thông báo tên tập tin
10400121_87110566301_7482172_n.jpg
(facebook thay đổi url bất cứ lúc nào để liên kết có thể bị phá vỡ)

Đó là không tuần tự. Cách duy nhất để có được bức tranh là biết địa chỉ của nó.
Dựa trên ảnh người dùng trước, bạn không thể đoán được ảnh tiếp theo.
Nó có một entropy rất lớn vì vậy ngay cả khi bạn bắt đầu dùng ngẫu nhiên đoán bạn sẽ có một số lượng lớn các thất bại và, nếu bạn nhận được một hình ảnh, bạn sẽ không thể, từ đó, nhận ra chủ sở hữu bản sắc trong đó, chính nó, là bảo vệ trong ẩn danh.

Chỉnh sửa (tại sao bạn không nên lưu trữ hình ảnh trong một "tên người dùng" thư mục:.
Sau khi chỉnh sửa của bạn nó trở nên rõ ràng rằng bạn thực hiện ý định đưa các tập tin trên đĩa và không phải trên cơ sở dữ liệu chỉnh sửa này bao gồm các kịch bản mới .

Mặc dù logic của bạn (tạo một thư mục trên mỗi người dùng) các đường nối có tổ chức hơn nhưng nó tạo ra các vấn đề khi bạn bắt đầu có nhiều người dùng và nhiều hình ảnh. Hãy tưởng tượng rằng máy chủ của bạn có dung lượng đĩa 1T. Và cho phép cũng tưởng tượng rằng 1T là chính xác hơn hoặc ít hơn với tải mà máy chủ có thể xử lý.

Bây giờ bạn có 11 người dùng, giả sử họ bắt đầu tải lên cùng một lúc và mỗi người sẽ tải lên hơn 100 GB tệp. Khi chúng đạt đến 91GB mỗi máy chủ đầy và bạn phải bắt đầu lưu trữ hình ảnh trên một máy chủ khác. Nếu người dùng/cấu trúc thư mục đó được theo dõi, bạn sẽ phải chọn một trong những người dùng và di chuyển tất cả dữ liệu của mình sang một máy chủ khác. Ngoài ra, nó còn gây khó khăn cho người dùng không thể tải lên nhiều hơn 1T trong các tệp.

Tôi có nên lưu trữ tất cả các tệp trong cùng một thư mục không?
Không, các trang web lớn thường lưu trữ tệp trong các thư mục tuần tự (/ 000001 /,/000002 /, v.v.) có số x tệp được xác định cho mỗi thư mục. Điều này chủ yếu là cho các vấn đề hiệu năng hệ thống tập tin.

Thông tin thêm về how many files in a directory is too many?

+14

Giải thích BRILLIANT. Chính xác những gì tôi đang tìm kiếm, cảm ơn. – CyberJunkie

+0

Cảm ơn Frankie, điều đó thực sự rất rõ ràng. Nhưng có một cách khác mà tôi nên thú vị hơn: lưu trữ hình ảnh trên một nhà cung cấp lưu trữ hình ảnh cụ thể. – Fred

+1

@Fred hoàn toàn đúng. Câu trả lời này được thiết kế đặc biệt để thiết lập tư duy chính xác trên một người không có ý tưởng về cách mọi thứ hoạt động. Ngay sau khi bạn bắt đầu lưu trữ một vài triệu hình ảnh trên trang web của bạn, bạn có thể muốn chia sự cố và/hoặc thuê ngoài lưu trữ những tài sản đó. Tuy nhiên, suy nghĩ vẫn giữ nguyên. Trên cơ sở dữ liệu bạn chỉ tham khảo vị trí hình ảnh. Cảm ơn bạn đã bình luận. – Frankie

4

Nó thường là một ý tưởng tồi để lưu trữ hình ảnh trong cơ sở dữ liệu của bạn (nếu trang web của bạn là phổ biến). Cơ sở dữ liệu, theo truyền thống, một trong những tắc nghẽn chính trong hầu hết mọi ứng dụng trên mạng. Không cần phải tải nó nhiều hơn mức cần thiết. Nếu hình ảnh có trong hệ thống tệp, nhiều máy chủ http (ví dụ: nginx) sẽ phục vụ chúng hiệu quả nhất.

Mạng xã hội lớn nhất ở Nga, Vkontakte thực hiện chính xác điều này: lưu trữ hình ảnh trong hệ thống tệp.

Một mạng xã hội lớn khác đã triển khai bộ nhớ blob có thể mở rộng tinh vi. Nhưng nó không có sẵn cho công chúng, AFAIK.

Tóm tắt câu trả lời này: không lưu trữ các đốm màu trong cơ sở dữ liệu.

1

Quản lý hình ảnh có thể đạt được tốt nhất bằng cách tải hình ảnh lên máy chủ và sau đó ghi lại vị trí tệp và chi tiết hình ảnh trong cơ sở dữ liệu. Sau đó, một Biểu mẫu tìm kiếm có thể được định cấu hình để cho phép người dùng thực hiện tìm kiếm văn bản, tìm kiếm số phần hoặc các truy vấn khác. Một kịch bản PHP có thể được viết để tạo ra một thẻ hình ảnh HTML hợp lệ dựa trên dữ liệu tìm thấy trong bảng.

tải lên hình ảnh vào trường MySQL BLOB là một ý tưởng tồi như vậy dữ liệu hình ảnh thường có vấn đề nếu hình ảnh lớn hơn nhiều so với hình thu nhỏ. Nếu hình ảnh lớn, bạn có thể phải sao chép/dán một câu lệnh SQL INSERT tại một thời điểm (vào phpMyAdmin). Nếu hình ảnh lớn và câu lệnh SQL INSERT được chia thành hai dòng bởi trình soạn thảo văn bản của bạn, bạn sẽ không bao giờ có thể khôi phục lại hình ảnh.

2

đây có phải là cách đúng đắn để làm

Yes.
Điều duy nhất tôi đề nghị không sử dụng tên nhưng id.
www.photos.com/albums/1234/ sẽ không sao để khởi động.

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