LƯU TRỮ FILE VỚI GOOGLE DRIVER TRONG LARAVEL

06-02-2018 11:35

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

  • Hướng dẫn cài đặt package cho Google Drive API V3

composer require nao-pon/flysystem-google-drive:~1.1

  • Hướng dẫn cài đặt package cho Google Drive API V2

composer require nao-pon/flysystem-google-drive:~1.0.0

 

  • Sau khi cài đặt xong, chúng ta thêm GoogleDriveServiceProvider::class, vào providers trong file config/app.php
'providers' => 
[ // ... 
App\Providers\GoogleDriveServiceProvider::class, 
// ... 
],
  • Sau đó thêm 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:

  • Lấy Client ID and Secret
  • Lấy Refresh Token
  • Lấy ID thư mục lưu trữ

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


https://images.viblo.asia/f19b0e77-ddec-4682-8d80-127fd9d08bdd.png
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 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 - 

Bài viết cùng chủ đề