- Trang chủ
- Giới thiệu
- Du học
- Đào tạo ngắn hạn
- Đào tạo chuyên sâu
- Tin Tức
- Học viên
- Blog
- Tin THPT
- Liên hệ
Khi bạn phát triển một website để chia sẻ tài nguyên cho người dùng thì chắc hẳn bạn sẽ phải tính toán xem việc lưu trữ tài nguyên của mình ở nơi nào đó. Có nhiều nơi để bạn lựa chọn lưu trữ dữ liệu như tại chính server, Amazon S3, Google Drive,…
Nếu website của bạn lớn và cần lưu trữ file có dung lượng lớn thì nên dùng Amazon S3 để lưu trữ là tốt nhất. Tuy nhiên thì trường hợp này bạn sẽ phải đầu tư một khoản chi phí để có được Amazon S3.
Vì vậy, ngày hôm nay, ITPlus xin được chia sẻ việc upload file lên Google Drive với website code bằng Laravel. Với mỗi tài khoản, Google Drive cung cấp 15GB để lưu trữ dữ liệu trên các dịch vụ như Drive, Mail, Photo+,…Vậy nên, Googlde Drive chỉ phù hợp với việc lưu trữ file ở dạng vừa và nhỏ. Nếu bạn muốn phát triển website lưu trữ trên Google Drive thì cần phải lưu ý điều này.
Cách cài đặt
Google cũng đã cung cấp API để chúng ta tương tác, tuy nhiên để sử dụng thuận tiện hơn, nhanh gọn hơn thì cần sử dụng package Flysystem Adapter for Google Drive
composer require nao-pon/flysystem-google-drive:~1.1
composer require nao-pon/flysystem-google-drive:~1.0.0
GoogleDriveServiceProvider::class
, vào providers
trong file config/app.php
'providers' => [ // ... App\Providers\GoogleDriveServiceProvider::class, // ... ],
google
dish vào config/filesystems.php
'disks' => [ // ... 'google' => [ 'driver' => 'google', 'clientId' => env('GOOGLE_DRIVE_CLIENT_ID'), 'clientSecret' => env('GOOGLE_DRIVE_CLIENT_SECRET'), 'refreshToken' => env('GOOGLE_DRIVE_REFRESH_TOKEN'), 'folderId' => env('GOOGLE_DRIVE_FOLDER_ID'), ], // ... ],
Tạo Google Drive API keys
Để lưu trữ được file trên Google Drive cần phải lấy 4 thông tin trên. Các thông tin chi tiết về cách lấy API ID, secret và refresh token xin mời bạn tham khảo hướng dẫn sau:
Cập nhật file .env
Thêm các keys lấy ở trong file .env
và đặt google làm cloud storage mặc định của bạn.
FILESYSTEM_CLOUD=google GOOGLE_DRIVE_CLIENT_ID=xxx.apps.googleusercontent.com GOOGLE_DRIVE_CLIENT_SECRET=xxx GOOGLE_DRIVE_REFRESH_TOKEN=xxx GOOGLE_DRIVE_FOLDER_ID=null
Lúc này bạn có thể truy cập vào google
dish như sau:
$googleDisk = Storage::disk('google');
Lúc này, bạn có thể gọi:
Storage::cloud(); // refers to Storage::disk('google')
Coding
Chúng ta bắt đầu thực hiện xem kết quả thực tế như thế nào nhé! Tạo file, download file, xóa file,…lên Google Drive và xem kết quả.
Tạo file mới
Đầu tiên, chúng ta tạo file trên Google Drive nhé!
Storage::cloud()->put(tên file, nội dung file);
Đây là một ví dụ về việc bạn muốn tạo file ‘text.txt’ với nội dung ‘Hello World’:
Route::get('put', function() { Storage::cloud()->put('test.txt', 'Hello World'); return 'File was saved to Google Drive'; });
Sau khi chạy link /put
, ta sẽ có kết quả là File was saved to Google Drive
Khi bạn mở thư mục mà đã được cài đặt lưu trữ file trên https://drive.google.com sẽ thấy một file test.txt
được tạo như sau:
Nội dung của nó sẽ là dòng chữ Hello World mà bạn tạo:
Tạo file có sẵn
Nếu bạn đã có sẵn một file trên hệ thống và muốn đẩy file đó lên Google Drive thì bạn cần get content của file đó và put lên thôi nhé!
Route::get('put-existing', function() { $filePath = public_path('logo.png'); $fileData = File::get($filePath); Storage::cloud()->put($filename, $fileData); return 'File was saved to Google Drive'; });
File ảnh đã được có mặt trên Google Drive rồi^^:
Lấy danh sách thư mục con hoặc file trong thư mục
Lấy danh sách file
Khi bạn muốn lấy danh sách file trong thư mục lưu trữ.
Route::get('list', function() { $dir = '/'; $recursive = false; // Có lấy file trong các thư mục con không? $contents = collect(Storage::cloud()->listContents($dir, $recursive)); return $contents->where('type', '=', 'file'); });
Kết quả lấy được là chuỗi JSON như sau:
Và khi parse JSON ra thì nó trả về đầy đủ các thông tin về các file:
Lưu ý: Thuộc tính path
bạn tìm thấy rất quan trọng, bạn có thể coi nó như ID của mỗi file để thao tác với từng file riêng dù các file trùng tên.
Lấy danh sách thư mục con
Việc lấy danh sách các thư mục con trong lưu trữ thư mục tương tự như lấy danh sách file, chỉ khác điều kiện lấy ra sẽ là where('type', '=', 'dir')
Route::get('list', function() { $dir = '/'; $recursive = false; // Có lấy file trong các thư mục con không? $contents = collect(Storage::cloud()->listContents($dir, $recursive)); return $contents->where('type', '=', 'dir'); // thư mục });
Download file từ Google Drive
Giờ chúng ta hãy thử download nó về xem sao nhé! Mấu chốt để download file về đó là từ thuộc tính path
của file ta lấy được nội dung file rồi truyền thêm thông số cần thiết vào header là
Content – Type và
Content - Disposition
Route::get('get', function() { $filename = 'test.txt'; $dir = '/'; $recursive = false; // Có lấy file trong các thư mục con không? $contents = collect(Storage::cloud()->listContents($dir, $recursive)); $file = $contents ->where('type', '=', 'file') ->where('filename', '=', pathinfo($filename, PATHINFO_FILENAME)) ->where('extension', '=', pathinfo($filename, PATHINFO_EXTENSION)) ->first(); // có thể bị trùng tên file với nhau! //return $file; // array with file info $rawData = Storage::cloud()->get($file['path']); return response($rawData, 200) ->header('Content-Type',$file['mimetype']) ->header('Content-Disposition', "attachment; filename='$filename'"); });
Đây là hình ảnh cho thấy việc bạn đã download được file từ Google Drive về máy:
Xóa file
Nếu bạn muốn xóa file, bạn cần lấy pat
của file sau đó sử dụng Storage::cloud()->delete($path);
là xong.
Route::get('delete', function() {
$filename = 'test.txt';
// Tìm file và sử dụng ID (path) của nó để xóa
$dir = '/'; $recursive = false; // Có lấy file trong các thư mục con không?
$contents = collect(Storage::cloud()->listContents($dir, $recursive));
$file = $contents ->where('type', '=', 'file')
->where('filename', '=', pathinfo($filename, PATHINFO_FILENAME))
->where('extension', '=', pathinfo($filename, PATHINFO_EXTENSION))
->first(); // có thể bị trùng tên file với nhau!
Storage::cloud()->delete($file['path']);
return 'File was deleted from Google Drive';
});
Sau khi xóa, bạn sẽ thấy dòng chữ 'File was deleted from Google Drive
và không tìm thấy file đó trên Google Drive nữa.
Trên đây, mình đã giới thiệu với các bạn 1 vài thao tác cơ bản để lưu trữ file với Google Drive như: tạo file, xóa file, download file, lấy danh sách file. Để có thể tìm hiểu về các thao tác khác như: tạo thư mục, tạo file trong thư mục, đổi tên thư mục, xóa thư mục, ...
Hy vọng, bài viết này của mình sẽ giúp ích cho các bạn với giải pháp lưu trữ trên Google Drive cho các website có dung lượng lưu trữ vừa và nhỏ. Và như mình đã nhấn mạnh bên trên, nếu nhu cầu lưu trữ cao ví dụ như website xem phim thì dùng Amazon S3 cho chuyên nghiệp nhé.
Cám ơn các bạn đã đọc bài viết.
- ITPlus Academy -