File Storage trong Laravel
Bài đăng này đã không được cập nhật trong 7 năm
1. Introduction
Laravel cung cấp một hệ thống tập tin mạnh mẽ trừu tượng nhờ gói Flysystem PHP
tuyệt vời của Frank de Jonge. Sự tích hợp Larvell Flysystem cung cấp các trình điều khiển đơn giản để sử dụng với các hệ thống tập tin địa phương, Amazon S3
và Rackspace Cloud Storage
. Thậm chí tốt hơn, thật dễ dàng để chuyển đổi giữa các tùy chọn lưu trữ này vì API vẫn giữ nguyên cho mỗi hệ thống.
2. Configuration
Tập tin để cấu hình hệ thống nằm ở config/filesystems.php. Trong tệp này, bạn có thể cấu hình tất cả các "disk". Mỗi đĩa đại diện cho một trình điều khiển lưu trữ và vị trí lưu trữ cụ thể. Ví dụ hỗ trợ cấu hình cho mỗi trình điều khiển được bao gồm trong tập tin cấu hình. Vì vậy, chỉ cần sửa đổi cấu hình để phản ánh sở thích và thông tin lưu trữ của bạn. Tất nhiên, bạn có thể cấu hình nhiều đĩa như bạn muốn, và thậm chí có thể có nhiều đĩa sử dụng cùng một trình điều khiển.
The Public Disk
The public disk
dành cho các tệp tin sẽ được truy cập công khai. Theo mặc định, the public disk sử dụng trình điều khiển cục bộ và lưu trữ các tệp này trong storage/app/public
. Để giúp họ có thể truy cập được từ web, bạn nên tạo liên kết biểu tượng từ public/storage
sang storage/app/public
. Quy ước này sẽ giữ các tập tin truy cập công cộng của bạn trong một thư mục có thể dễ dàng chia sẻ qua các triển khai khi sử dụng các hệ thống triển khai không xuống thời gian như Envoyer.
Để tạo liên kết tượng trưng, bạn có thể sử dụng storage:link
Artisan command:
php artisan storage:link
Tất nhiên, một khi tệp đã được lưu trữ và liên kết biểu tượng đã được tạo, bạn có thể tạo một URL cho các tệp bằng cách sử dụng asset
trợ giúp:
echo asset('storage/file.txt');
The Local Driver
Khi sử dụng trình điều khiển local , tất cả hoạt động của tệp đều liên quan đến thư mục root được định nghĩa trong tệp cấu hình của bạn. Theo mặc định, giá trị này được đặt thành thư mục storage/app
. Vì vậy, phương pháp sau đây sẽ được lưu trữ trong tệp storage/app/file.txt
:
Storage::disk('local')->put('file.txt', 'Contents');
Driver Prerequisites
Composer Packages
Trước khi sử dụng trình điều khiển S3 hoặc Rackspace, bạn cần phải cài đặt gói phần mềm thích hợp qua Trình biên soạn:
Amazon S3: league/flysystem-aws-s3-v3 ~1.0
Rackspace: league/flysystem-rackspace ~1.0
Cấu hình trình điều khiển S3
Thông tin cấu hình trình điều khiển S3 nằm trong tập tin cấu hình config/filesystems.php
. Tập tin này chứa một mảng cấu hình ví dụ cho trình điều khiển S3. Bạn được tự do sửa đổi mảng này với cấu hình S3 của riêng bạn và các thông tin.
Cấu hình trình điều khiển FTP
Sự tích hợp hệ thống Flysystem của Laravel hoạt động tốt với FTP; tuy nhiên, một cấu hình mẫu không được bao gồm trong tập tin cấu hình mặc định của file filesystems.php
. Nếu bạn cần phải cấu hình một hệ thống tập tin FTP, bạn có thể sử dụng cấu hình ví dụ dưới đây:
'ftp' => [
'driver' => 'ftp',
'host' => 'ftp.example.com',
'username' => 'your-username',
'password' => 'your-password',
// Optional FTP Settings...
// 'port' => 21,
// 'root' => '',
// 'passive' => true,
// 'ssl' => true,
// 'timeout' => 30,
],
**Cấu hình Rackspace Driver **
Sự tích hợp Flysystem
của Laravel hoạt động tốt với Rackspace; tuy nhiên, một cấu hình mẫu không được bao gồm trong tập tin cấu hình mặc định của file cấu hình filesystems.php. Nếu bạn cần phải cấu hình một hệ thống tập tin Rackspace, bạn có thể sử dụng cấu hình ví dụ dưới đây:
'rackspace' => [
'driver' => 'rackspace',
'username' => 'your-username',
'key' => 'your-key',
'container' => 'your-container',
'endpoint' => 'https://identity.api.rackspacecloud.com/v2.0/',
'region' => 'IAD',
'url_type' => 'publicURL',
],
3.Obtaining Disk Instances
Mặt trước của Storage
có thể được sử dụng để tương tác với bất kỳ đĩa nào của bạn được định cấu hình. Ví dụ, bạn có thể sử dụng phương thức put trên mặt trước để lưu trữ hình đại diện trên đĩa mặc định. Nếu bạn gọi các phương thức trên mặt trước của Storage
lưu trữ mà không cần gọi phương thức disk , phương thức được gọi sẽ tự động được chuyển tới đĩa mặc định:
use Illuminate\Support\Facades\Storage;
Storage::put('avatars/1', $fileContents);
Nếu ứng dụng của bạn tương tác với nhiều đĩa, bạn có thể sử dụng phương thức disk trên mặt trước của Storage
để làm việc với các tệp trên một đĩa cụ thể:
Storage::disk('s3')->put('avatars/1', $fileContents);
Retrieving Files
Phương thức get có thể được sử dụng để lấy nội dung của một tệp. Các nội dung chuỗi thô của tập tin sẽ được trả về theo phương pháp. Hãy nhớ rằng, tất cả đường dẫn tệp phải được chỉ định liên quan đến vị trí "root"
được định cấu hình cho đĩa:
$contents = Storage::get('file.jpg');
Phương thức exists
có thể sử dụng để xác định xem tệp có tồn tại trên đĩa:
$exists = Storage::disk('s3')->exists('file.jpg');
File URLs
Bạn có thể sử dụng phương thức url để lấy URL cho tệp tin đã cho. Nếu bạn đang sử dụng trình điều khiển local, điều này thông thường chỉ cần thêm /storage
vào đường dẫn đã cho và trả lại một URL tương đối cho tệp tin. Nếu bạn đang sử dụng trình điều khiển s3
hoặc rackspace
, URL từ xa đủ điều kiện sẽ được trả lại:
use Illuminate\Support\Facades\Storage;
$url = Storage::url('file1.jpg');
Temporary URLs
Đối với các tệp được lưu trữ bằng trình điều khiển s3 hoặc rackspace, bạn có thể tạo URL tạm thời cho một tệp được sử dụng phương thức temporaryUrl
. Các phương pháp này chấp nhận một đường dẫn và một path
và một DateTime
xác định khi nào URL hết hạn:
$url = Storage::temporaryUrl(
'file1.jpg', Carbon::now()->addMinutes(5)
);
Local URL Host Customization Nếu bạn muốn xác định trước máy chủ lưu trữ các tệp được lưu trữ trên đĩa sử dụng trình điều khiển local, bạn có thể thêm tùy chọn url vào mảng cấu hình của đĩa:
'public' => [
'driver' => 'local',
'root' => storage_path('app/public'),
'url' => env('APP_URL').'/storage',
'visibility' => 'public',
],
File Metadata
Ngoài việc đọc và viết các tập tin, Laravel
cũng có thể cung cấp thông tin về các tập tin về bản thân chúng. Ví dụ, phương thức size có thể được sử dụng để lấy kích thước của tệp theo byte:
use Illuminate\Support\Facades\Storage;
$size = Storage::size('file1.jpg');
Phương thức lastModified
trả về timestamp UNIX
của lần cuối cùng tệp đã được sửa đổi:
$time = Storage::lastModified('file1.jpg');
4. Storing Files
Phương thức put có thể được sử dụng để lưu trữ nội dung tập tin thô trên đĩa. Bạn cũng có thể truyền một PHP resource tới phương thức put, nó sẽ sử dụng hỗ trợ dòng dưới của Flysystem. Sử dụng rất nhiều các luồng được đề nghị khi xử lý các tệp lớn:
use Illuminate\Support\Facades\Storage;
Storage::put('file.jpg', $contents);
Storage::put('file.jpg', $resource);
Automatic Streaming
Nếu bạn muốn Laravel tự động quản lý streaming một tập tin nhất định đến vị trí lưu trữ của bạn, bạn có thể sử dụng phương thức putFile
hoặc putFileAs
. Phương pháp này chấp nhận một yêu cầu Illuminate\Http\File
hoặc Illuminate\Http\UploadedFile
và sẽ tự động truyền tệp đến vị trí mong muốn của bạn:
use Illuminate\Http\File;
use Illuminate\Support\Facades\Storage;
// Automatically generate a unique ID for file name...
Storage::putFile('photos', new File('/path/to/photo'));
// Manually specify a file name...
Storage::putFileAs('photos', new File('/path/to/photo'), 'photo.jpg');
Có một vài điều quan trọng cần lưu ý về phương thức putFile
. Lưu ý rằng chúng tôi chỉ định tên thư mục, chứ không phải tên tệp tin. Theo mặc định, phương thức putFile
sẽ tạo ra một ID duy nhất để phục vụ như là tên tập tin. Đường dẫn đến tệp tin sẽ được trả lại bằng phương thức putFile để bạn có thể lưu trữ đường dẫn, bao gồm cả tên tệp được tạo ra, trong cơ sở dữ liệu của bạn.
Các phương thức putFile
và putFileAs
cũng chấp nhận một đối số để xác định "khả năng hiển thị" của tệp lưu trữ. Điều này đặc biệt hữu ích nếu bạn đang lưu trữ tệp trên đĩa đám mây như S3
và muốn tập tin được truy cập công cộng:
Storage::putFile('photos', new File('/path/to/photo'), 'public');
Prepending & Appending To Files
Phương thức prepend
và append
cho phép bạn ghi vào đầu hoặc cuối của một tệp tin:
Storage::prepend('file.log', 'Prepended Text');
Storage::append('file.log', 'Appended Text');
Copying & Moving Files
Phương thức copy có thể được sử dụng để sao chép một tệp tin hiện có vào một vị trí mới trên đĩa, trong khi phương thức move có thể sử dụng để đổi tên hoặc di chuyển một tệp hiện có sang một vị trí mới:
Storage::copy('old/file1.jpg', 'new/file1.jpg');
Storage::move('old/file1.jpg', 'new/file1.jpg');
File Uploads
Trong các ứng dụng web, một trong những trường hợp sử dụng phổ biến nhất để lưu trữ các tệp là lưu trữ các tệp tin tải lên của người dùng như ảnh tiểu sử, ảnh và tài liệu. Laravel giúp bạn dễ dàng lưu các tệp được tải lên bằng cách sử dụng phương thức store trên tệp tin được tải lên. Đơn giản chỉ cần gọi phương thức store với đường dẫn mà bạn muốn lưu trữ tệp đã tải lên:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class UserAvatarController extends Controller
{
/**
* Update the avatar for the user.
*
* @param Request $request
* @return Response
*/
public function update(Request $request)
{
$path = $request->file('avatar')->store('avatars');
return $path;
}
}
Có một số điều quan trọng cần lưu ý về ví dụ này. Lưu ý rằng chúng tôi chỉ định tên thư mục, chứ không phải tên tệp tin. Theo mặc định, phương thức store sẽ tạo một ID duy nhất để phục vụ dưới dạng tên tệp. Đường dẫn tới tệp tin sẽ được trả lại theo phương thức store để bạn có thể lưu trữ đường dẫn, bao gồm tên tệp được tạo ra, trong cơ sở dữ liệu của bạn.
Bạn cũng có thể gọi phương thứcputFile
trên mặt trước của Storage
để thực hiện thao tác thao tác giống như ví dụ trên:
$path = Storage::putFile('avatars', $request->file('avatar'));
Specifying A File Name
Nếu bạn không thích tên tệp được tự động gán vào tệp lưu trữ của mình, bạn có thể sử dụng phương thức storeAs tệp này nhận đường dẫn, tên tệp và đĩa (tùy chọn) làm đối số của nó:
$path = $request->file('avatar')->storeAs(
'avatars', $request->user()->id
);
Tất nhiên, bạn cũng có thể sử dụng phương thức putFileAs
trên mặt trước Storage
, nó sẽ thực hiện thao tác giống như ví dụ trên:
$path = Storage::putFileAs(
'avatars', $request->file('avatar'), $request->user()->id
);
Specifying A Disk
Theo mặc định, phương pháp này sẽ sử dụng đĩa mặc định của bạn. Nếu bạn muốn chỉ định một đĩa khác, truyền tên đĩa như là đối số thứ hai sang phương thức store
:
$path = $request->file('avatar')->store(
'avatars/'.$request->user()->id, 's3'
);
``
**File Visibility**
Trong tích hợp Hệ thống `Flysystem` của Laravel, "khả năng hiển thị" là sự trừu tượng của quyền truy cập tệp trên nhiều nền tảng. Các tệp tin có thể được khai báo public hoặc private. Khi một tập tin được khai báo public, bạn đang chỉ ra rằng các tập tin thường có thể truy cập cho người khác. Ví dụ, khi sử dụng trình điều khiển `S3`, bạn có thể lấy URL cho các tệp public.
Bạn có thể thiết lập chế độ hiển thị khi thiết lập tập tin thông qua phương thức `put` :`
```php
use Illuminate\Support\Facades\Storage;
Storage::put('file.jpg', $contents, 'public');
Nếu tập tin đã được lưu trữ, khả năng hiển thị của nó có thể được lấy ra và thiết lập thông qua các phương thức getVisibility
và setVisibility
:
$visibility = Storage::getVisibility('file.jpg');
Storage::setVisibility('file.jpg', 'public')
5.Deleting Files
Phương thức delete
chấp nhận một tên tập tin hoặc một mảng các tệp để xóa khỏi đĩa:
use Illuminate\Support\Facades\Storage;
Storage::delete('file.jpg');
Storage::delete(['file1.jpg', 'file2.jpg']);
6. Directories
Get All Files Within A Directory
Phương thức files trả về một mảng của tất cả các tệp trong một thư mục nhất định. Nếu bạn muốn lấy một danh sách tất cả các tệp trong một thư mục nhất định bao gồm tất cả thư mục con, bạn có thể sử dụng phương thức allFiles
:
use Illuminate\Support\Facades\Storage;
$files = Storage::files($directory);
$files = Storage::allFiles($directory);
Get All Directories Within A Directory
Phương thức directories
trả về một mảng của tất cả thư mục trong một thư mục nhất định. Ngoài ra, bạn có thể sử dụng phương thức allDirectories
để nhận danh sách tất cả các thư mục trong một thư mục nhất định và tất cả thư mục phụ của nó:
$directories = Storage::directories($directory);
// Recursive...
$directories = Storage::allDirectories($directory);
Create A Directory Phương thức makeDirectory sẽ tạo ra thư mục đã cho, bao gồm bất kỳ thư mục con cần thiết
Storage::makeDirectory($directory);
Delete A Directory
Storage::deleteDirectory($directory);
Custom Filesystems Sự tích hợp hệ thống Flysystem của Laravel cung cấp trình điều khiển cho một số "trình điều khiển" ra khỏi hộp; tuy nhiên, Flysystem không chỉ giới hạn trong các thiết bị này và có bộ điều khiển thích hợp cho nhiều hệ thống lưu trữ khác. Bạn có thể tạo trình điều khiển tùy chỉnh nếu bạn muốn sử dụng một trong những bộ điều hợp bổ sung này trong ứng dụng Laravel của bạn. Để thiết lập hệ thống tập tin tùy chỉnh, bạn sẽ cần một bộ điều hợp hệ thống Flysystem. Hãy thêm một cộng đồng được duy trì bộ điều hợp Dropbox cho dự án của chúng tôi:
composer require spatie/flysystem-dropbox
Tiếp theo, bạn nên tạo một nhà cung cấp dịch vụ như DropboxServiceProvider
. Trong phương thức boot của nhà cung cấp, bạn có thể sử dụng mặt trước của Storage
phương thức extend
để xác định trình điều khiển tùy chỉnh:
<?php
namespace App\Providers;
use Storage;
use League\Flysystem\Filesystem;
use Illuminate\Support\ServiceProvider;
use Spatie\Dropbox\Client as DropboxClient;
use Spatie\FlysystemDropbox\DropboxAdapter;
class DropboxServiceProvider extends ServiceProvider
{
/**
* Perform post-registration booting of services.
*
* @return void
*/
public function boot()
{
Storage::extend('dropbox', function ($app, $config) {
$client = new DropboxClient(
$config['authorizationToken']
);
return new Filesystem(new DropboxAdapter($client));
});
}
/**
* Register bindings in the container.
*
* @return void
*/
public function register()
{
//
}
}
Đối số đầu tiên của phương thức extend
là tên của trình điều khiển và thứ hai là Closure
nhận các biến $app
và $config
. Việc giải quyết Closure phải trả lại một yêu cầu của League\Flysystem\Filesystem
. Biến $config chứa các giá trị được định nghĩa trong config/filesystems.php
cho đĩa đã chỉ định.
Khi bạn đã tạo nhà cung cấp dịch vụ để đăng ký tiện ích, bạn có thể sử dụng trình điều khiển dropbox trong tập tin cấu hình config/filesystems.php
.
- Tài liệu tham khảo : https://laravel.com/docs/5.5/filesystem
All rights reserved