V/v upload ảnh và quản lý ảnh trên website
Mọi người có thể cho em hỏi 1 thắc mắc về việc upload ảnh!...
Em đang code 1 trang web và đang vướng về việc người dùng upload ảnh. E muốn xây dựng một hệ thống upload ảnh và quản lý ảnh của người dùng cho từng công viêc, và cụ thể là cho việc đăng bài trong trang web... E muốn làm chức nắng như của viblo mình, mỗi lần click vào button upload
hệ thống sẽ hiển thị những hình ảnh mà user đó đã upload trước đó và tái sử dụng lại được ạ.
E có một ý tưởng crazy như sau ạ:
E tạo một bảng images
lưu các trường là id
, urlImg
, user_id
(khóa ngoại nối với bảng users
để biết được ảnh này của ai upload lên)
Và khi click vào button upload
thì sẽ hiển thị lên những ảnh user
đó upload bằng việc query
theo user_id
đã được lưu trong bảng images
.
Vậy, ý tưởng như thế có thể khả thi và nếu có cách nào tốt hơn hoặc tối ưu hơn, em xin ý kiến của các anh chị để đúc rút được kinh nghiệm được không ạ?
Em cám ơn.
1 CÂU TRẢ LỜI
Mình thấy hướng đi của bạn đúng rồi đấy! Nhưng bạn có thể mở rộng bảng images
thành uploads
, lưu thông tin của tất cả các file được upload lên không chỉ giới hạn là Image mà có thể là Video
, Document
... Sử dụng relation Polymorphic
của Laravel trong trường hợp đấy rất hiệu quả. Còn nếu không cần thiết thì bạn dùng bảng images
như kia cũng được. Có thể lưu thêm các thông tin khác như: file size, file name, file extension, path/to/folder... Có thể nó sẽ cần thiết khi bạn hiển thị danh sách các file được upload.
Đối với việc hiển thị hình ảnh, bạn có thể hiển thị qua một url riêng biệt dựa trên id của model Upload
.
VD với Viblo:
Ảnh avatar: https://images.viblo.asia/avatar/005d826e-8b0c-4421-b95f-a5fd1eb85d54.jpg
Ảnh thumbnail: https://images.viblo.asia/thumbnail/005d826e-8b0c-4421-b95f-a5fd1eb85d54.jpg
Ảnh gốc: https://images.viblo.asia/full/005d826e-8b0c-4421-b95f-a5fd1eb85d54.jpg
URL hiển thị ảnh được tính toán sắp đặt sẵn, nếu có thay đổi cấu trúc thư mục lưu file thì tất cả các đường dẫn hình ảnh kia vẫn sẽ hoạt động bình thường trong bài viết của bạn.
Với ID, thay vì dùng id
- Integer và auto increment, bạn nên sử dụng dạng hash id như: uuid
, hay md5
... Chẳng hạn như ví dụ ở trên, Viblo sử dụng chuỗi hash 005d826e-8b0c-4421-b95f-a5fd1eb85d54
thay cho id nguyên thủy.
Thật chi tiết ạ... E rất cám ơn a....
@huukimit Anh cho em hỏi là mình dùng hash id như uuid
, hay md5
thì có được những lợi ích gì ạ?
Tại vì e chưa hiểu nên e mới hỏi ạ, mong anh thông cảm và giải đáp giúp e ạ.
@minhtuancnttk39 Có lẽ bạn có thể thấy mục đích đơn giản là ẩn đi giá trị của id nguyên thủy (integer - auto increment) vì nó là một cái bộ đếm. Đối thủ của bạn có thể nhìn vào URL dự đoán được bảng dữ liệu đấy có bao nhiêu records. Ngoài ra, hash id trên url nên nó khó nhớ hơn url dạng integer.
VD:
-
Nếu url dạng:
https://localhost/posts/1
, người khác có thể viết code crawl dư liệu dễ hơn, chỉ cần vòng for thay số 1 bằng 1 số khác là họ có dư liệu của một bản ghi khác, dù chưa biết là có tồn tại record nào theo id đó ko. :v Nếu dạnghttps://localhost/posts/WrZnjNQrZxw
thì sao họ dự đoán được một id khác để thay thế nhỉ? -
Nếu là bảng users, họ biết bạn đang có bao nhiêu users, nếu họ thống kê hàng tháng họ đoán được tốc độ phát triển của bên bạn như nào... Điều này là ko hay nên tốt nhất là ẩn id đi và sử dụng hash id.
Bonus:
- Hash id thì cũng phải là chuỗi đã mã hóa và unique.
- Có thể được tự động tạo. Mình thấy các DBMS đều hỗ trợ tự động sinh hash id là khi tạo mới một record theo quy tắc bạn muốn.
@huukimit Dạ, e đã hiểu ạ.. e sẽ thay thế toàn bộ id
thành uuid
.
E cám ơn a nhiều ạ.