12/08/2018, 16:19

File Storage trong Laravel

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 để ...

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.

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',
],

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 IlluminateSupportFacadesStorage;

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 IlluminateSupportFacadesStorage;

$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 IlluminateSupportFacadesStorage;

$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');

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 IlluminateSupportFacadesStorage;

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 IlluminateHttpFile hoặc IlluminateHttpUploadedFile và sẽ tự động truyền tệp đến vị trí mong muốn của bạn:

use IlluminateHttpFile;
use IlluminateSupportFacadesStorage;

// 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 AppHttpControllers;

use IlluminateHttpRequest;
use AppHttpControllersController;

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 IlluminateSupportFacadesStorage;

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')

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 IlluminateSupportFacadesStorage;

Storage::delete('file.jpg');

Storage::delete(['file1.jpg', 'file2.jpg']);

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 IlluminateSupportFacadesStorage;

$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 AppProviders;

use Storage;
use LeagueFlysystemFilesystem;
use IlluminateSupportServiceProvider;
use SpatieDropboxClient as DropboxClient;
use SpatieFlysystemDropboxDropboxAdapter;

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  LeagueFlysystemFilesystem. Biến $$onfig 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 .

0