[CakePHP] Tìm hiểu Uploader plugin (P3)
Tiếp tục phần thứ 2 về tìm hiểu Uploader plugin, trong phần cuối này chúng ta sẽ đi vào code demo cho các nội dung bên dưới : Chỉnh sửa tên file khi upload. Sử dụng tranform : flip, scale, fit. Lưu trữ meta data của file. Upload nhiều file cùng lúc. Upload thông qua URL ...
Tiếp tục phần thứ 2 về tìm hiểu Uploader plugin, trong phần cuối này chúng ta sẽ đi vào code demo cho các nội dung bên dưới :
- Chỉnh sửa tên file khi upload.
- Sử dụng tranform : flip, scale, fit.
- Lưu trữ meta data của file.
- Upload nhiều file cùng lúc.
- Upload thông qua URL
Uploader cung cấp cho chúng ta 3 cài đặt dùng cho việc sửa lại tên file theo format của người dùng, đó là :
- nameCallback : cài đặt này cho phép gọi đến phương thức chỉnh sửa tên file có trong model hiện tại. Phương thức này sẽ trả về tên file mới, nó cần 2 tham số là tên file hiện tại và object File thông qua Transit. Object này có thể lấy thông tin như kích cỡ, đuôi mở rộng... của file upload.
- append : cài đặt này cho phép thêm vào cuối file một chuỗi nào đó.
- prepend : giống với append nhưng sẽ thêm vào đầu file một chuỗi.
Hãy viết một phương thức để chỉnh sửa tên file như dưới đây và sau đó gọi đến nó bằng 'nameCallback ' => 'formatName' trong khai báo $$ctAs :
public function formatName($name, $file) { return sprintf('%s-%s', $name, $file->size()); }
Và cũng thử thêm cài đặt append, prepend vào $$ctAs để xem kết ủa trả về như nào :
'append' => '-test', 'prepend' => 'demo-', // bạn sẽ có file name dạng : demo-money-732466-test.jpg
2.1) flip
Trong cài đặt 'transform' ở phần 2, bạn đã có crop để crop ảnh làm thumbail. Giờ bạn hãy thêm vào code dưới, cài đặt flip sẽ lật bức ảnh theo chiều ngang, dọc hoặc cả 2 chiều.
array('method' => 'flip', 'quality' => 80, // chất lượng tấm ảnh flip, nhưng chỉ áp dụng cho jpg 'direction' => 'horizontal' // bạn có thể để vertical hoặc both ) // tên file của ảnh flip có dạng, // 1 là số đếm, nếu đã có trùng tên file thì sẽ tăng lên 2 ... : // "tên file-flip-horizontal-1".jpg
2.2) scale
Tiếp tục với scale sẽ cho phép bạn set cho bức ảnh tăng hay gỉam kích cỡ dựa vào 'percent', chú ý là gía trị bạn gán cho 'percent' là một số kiểu float, 1 tương đương 100% nên bạn muốn gỉam 50% bức ảnh thì bạn sẽ set 'percent' => 0.5. Hãy thử với đoạn code, thêm vào cài đặt 'transform' trong $$ctAs :
array('method' => 'scale', 'quality' => 100, // chỉ dành cho ảnh jpg 'percent' => 1.2 )
2.3) fit
Với cài đặt fit bạn sẽ có thể set ảnh với độ rộng, chiều cao nào đó. Bức ảnh sẽ được căn cả theo trục ngang và đứng dựa vào 'vertical' và 'horizontal'. Còn 'fill' sẽ cho phép setup một màu nào đó cho phần bị trống do fit ảnh, nó nhận một mảng gía trị màu RGB như ví dụ dưới tôi để màu trắng. Nếu để tr
array('method' => 'fit', 'awidth' => 1980, 'height' => 1280, 'quality' => 100, 'fill' => array('255','255','255' ), 'vertical' => 'center', 'horizontal' => 'left' )
Trong những trường hợp nhất định nào đó, chắc hẳn bạn sẽ quan tâm đến những thông số meta data của bức ảnh như các thông tin có trong exif (máy nào đã chụp bức hình đó, độ phơi sáng bức ảnh, ngày chụp, iso khi chụp ...). Để phục vụ nhu cầu đó Uploader cung cấp cài đặt 'metaColumns', với các lựa chọn : basename (có đuôi mở rộng ), ext, name (không có đuôi mở rộng), size, type (mime type), awidth, height, exif.make, exif.model, exif.exposure, exif.orientation, exif.fnumber, exif.date, exif.iso, and exif.focal. Hãy thử lấy ra một vài thông tin bằng cách khai báo trong $$ctAs :
'metaColumns' => array( 'name' => 'file_name', // đuôi mở rộng 'size' => 'file_size', // kích cỡ filee 'exif.model' => 'camera' // loại camera đã chụp 'exif.date' => 'taken_date' // ngày chụp )
Nhưng trước khi chạy demo thì các bạn cần chỉnh lại bảng images để có các trường dùng để lưu trữ các thông tin meta tương ứng. Lần trước tôi đã có tạo ra trường file_name, file_size nên bài này hãy add thêm trường camera và taken_date.
// câu dưới có thể khác, tùy vào bảng imges của bạn đang như nào ALTER TABLE `demo`.`images` ADD COLUMN `camera` VARCHAR(45) NULL AFTER `modified`, ADD COLUMN `taken_date` VARCHAR(45) NULL AFTER `camera`;
Và đồng thời chỗ lấy tên file, kích cỡ file trong code của controller lần trước cũng không cần nữa, hãy xóa chúng đi