EzyPlatform quản lý media thế nào?
Back To BlogsThiết kế cơ sở dữ liệu
Cũng không có gì là thần thánh ở đây cả, EzyPlatform chỉ sử dụng duy nhất một bảng có tên là ezy_medias với mã nguồn như sau:
CREATE TABLE IF NOT EXISTS `ezy_medias` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT, `name` varchar(150) NOT NULL COLLATE utf8mb4_unicode_520_ci NOT NULL, `url` varchar(300) COLLATE utf8mb4_unicode_520_ci, `original_name` varchar(150) NOT NULL COLLATE utf8mb4_unicode_520_ci NOT NULL, `upload_from` varchar(9) COLLATE utf8mb4_unicode_520_ci NOT NULL, `media_type` varchar(9) COLLATE utf8mb4_unicode_520_ci NOT NULL, `mime_type` varchar(90) COLLATE utf8mb4_unicode_520_ci NOT NULL, `owner_user_id` bigint unsigned NOT NULL, `owner_admin_id` bigint unsigned NOT NULL, `title` varchar(100) NOT NULL COLLATE utf8mb4_unicode_520_ci NOT NULL, `caption` varchar(100) NOT NULL COLLATE utf8mb4_unicode_520_ci NOT NULL, `alternative_text` varchar(100) NOT NULL COLLATE utf8mb4_unicode_520_ci NOT NULL, `description` varchar(3500) NOT NULL COLLATE utf8mb4_unicode_520_ci NOT NULL, `public_media` tinyint NOT NULL DEFAULT 1, `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `key_name` (`name`), INDEX `index_upload_from` (`upload_from`), INDEX `index_media_type` (`media_type`), INDEX `index_mime_type` (`mime_type`), INDEX `index_owner_user_id` (`owner_user_id`), INDEX `index_owner_admin_id` (`owner_admin_id`), INDEX `index_owner_public_media` (`public_media`), INDEX `index_created_at` (`created_at`), INDEX `index_updated_at` (`updated_at`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;
Ý nghĩa của một số trường trong bảng này sẽ như sau:
- name: Là tên duy nhất của media, sẽ được tạo ngẫu nhiên khi quản trị viên hoặc người dùng tải lên.
- url: Là đường dẫn của media, mặc định sẽ là
/api/v1/media/{name}. Trường này sẽ có ích khi bạn quản lý các media nằm ngoài EzyPlatform. original_name: Là tên gốc của media được tải lên.upload_from: Media này được tải lên từ đâu, từ web hay admin.media_type: Kiểu của media này là gì, làVIDEO,AUDIOhayIMAGE, ... Bạn có thể tham khảo các kiểu media tại lớp MediaType.mime_type: Là kiểu mime type của media, có thể làimage/jpeghayimage/png, ... Bạn có thể tham khảo các mine type ở đây.owner_user_id: Là id của người dùng tải lên media.owner_admin_id: Là id của admin tải lên media.public_media: Để chỉ định rằng media có được public cho ai cũng xem được không hay là chỉ người tải lên mới xem được.
Thiết kế lớp
Mặc dù chỉ có một bảng duy nhất nhưng lại có khá nhiều lớp được sinh ra bởi EzyPlatform để quản lý media:
Ở đây có rất nhiều lớp nhưng một số lớp bạn sẽ hay sử dụng đó là:
- MediaModel: Bạn sẽ hay sử dụng lớp này hoặc lớp
MediaNameModelđể để lấy thông tin của media và trả về cho client. - MediaService: Giao diện này cung cấp các hàm quản lý media.
- AdminMediaControllerService, WebMediaControllerService hoặc MediaControllerService: Các lớp này dùng để lấy dữ liệu phân trang media, cung cấp các hàm để upload và download media.
- WebApiMediaDetailsController: Đây là lớp cung cấp các hàm cho phép người dùng upload, sửa, xoá được media từ web, mặc định thì nó sẽ chưa được cấp thành controller, ở từng dự án cụ thể, nhà phát triển sẽ quyết định có cài đặt lớp này không để cung cấp các tính năng, vì không phải dự án nào cũng cho phép người dùng tải lên media.
EzyPlatform chống tấn công qua tập tin thế nào
Một tập tin khi được muốn được chấp nhận và ghi vào thư mục upload của EzyPlatform sẽ cần trải qua các bước sau:
- Kiểm tra kích thước tập tin, nếu quá lớn só với kích thước được quy định trong cài đặt thì sẽ không được chấp nhận.
- Giản mã ra mime type bởi thư viện Apache Tika. Lưu ý rằng EzyPlatform sẽ không dựa vào phần mở rộng của tập tin để giải mã mime type, vì thông tin này không chính xác, bất kỳ tập tin nào cũng có thể bị đổi phần mở rộng.
- Kiểm tra xem mime type được giải mã có nằm trong danh sách được cài đặt không.
- Nếu mọi thứ đều hợp lệ thì tập tin media sẽ được lưu vào thư mục
uploadcủa EzyPlatform.
Sử dụng
Người dùng có thể tải lên media nếu như nhà phát triển có cung cấp tính năng này qua website, app hay API:
Ở admin, quản trị viên có thể tải media lên qua menu media bằng việc kéo thả hoặc nhấn vào nút thêm thông qua popup hoặc trang thư viện media:
Tổng kết
Quản lý media là một trong những tính năng quan trọng của EzyPlatform để giúp các nhà phát triển không cần bận tâm về tính năng này nữa. Bằng cách cung cấp rất nhiều lớp và cơ chế xác thực, EzyPlatform đảm bảo việc quản lý media một cách tiện lợi và an toàn nhất cho cả người dùng và các nhà phát triển. Sẽ có những bài khác để mình nói sâu hơn về quản lý media trong EzyPlatform nhé.