Asked May 1st, 2018 7:16 PM 253 3 1
  • 253 3 1
+2

V/v upload ảnh và quản lý ảnh trên website

Share
  • 253 3 1

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 ANSWERS


Answered May 2nd, 2018 1:05 AM
Accepted
+8

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.

Share
Nguyễn Minh Tuấn @minhtuancnttk39
May 2nd, 2018 9:27 AM

Thật chi tiết ạ... E rất cám ơn a....

+1
| Reply
Share
Nguyễn Minh Tuấn @minhtuancnttk39
May 6th, 2018 4:26 PM

@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 ạ.

0
| Reply
Share
May 7th, 2018 3:24 AM

@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ạng https://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.
0
| Reply
Share
Nguyễn Minh Tuấn @minhtuancnttk39
May 7th, 2018 2:35 PM

@huukimit Dạ, e đã hiểu ạ.. e sẽ thay thế toàn bộ id thành uuid.

E cám ơn a nhiều ạ.

0
| Reply
Share