Может войдёшь?
Черновики Написать статью Профиль

Файловая система

перевод документация 5.х

  1. 1. Введение
  2. 2. Настройка
  3. 3. Основы использования
    1. 3.1. Получение экземпляров дисков
    2. 3.2. Чтение файлов
    3. 3.3. URL файла
    4. 3.4. Запись файлов
    5. 3.5. Видимость файлов
    6. 3.6. Удаление файлов
    7. 3.7. Папки
  4. 4. Пользовательские файловые системы
Этот перевод актуален для англоязычной документации на (ветка 5.2) , (ветка 5.1) и (ветка 5.0). Опечатка? Выдели и нажми Ctrl+Enter.

Введение

Laravel предоставляет мощную абстракцию для работы с файловой системой благодаря восхитительному PHP-пакету Flysystem от Франка де Жонге. Laravel Flysystem содержит простые в использовании драйвера для работы с локальными файловыми системами, Amazon S3 и Rackspace Cloud Storage. Более того, можно очень просто переключаться между этими вариантами хранения файлов, поскольку у всех одинаковый API.

Настройка

Настройки файловой системы находятся в файле config/filesystems.php. В нём вы можете настроить все свои «disks». Каждый диск представляет определенный драйвер и место хранения. В конфигурационном файле имеются примеры для каждого поддерживаемого драйвера. Поэтому вы можете просто немного изменить конфигурацию под ваши нужды!

Конечно, вы можете сконфигурировать столько дисков, сколько вам будет угодно, и даже можете иметь несколько дисков, которые используют один драйвер.

+ 5.2

добавлено в 5.2 ()

Общий диск

Диск public предназначен для общего доступа к файлам. По умолчанию диск public использует драйвер local и хранит файлы в storage/app/public. Чтобы сделать их доступными через веб, вам надо создать символьную ссылку из public/storage на storage/app/public. При этом ваши общедоступные файлы будут храниться в одной папке, которую легко можно использовать в разных развёртываниях при использовании систем обновления на лету, таких как Envoyer.

Само собой, когда файл сохранён и создана символьная ссылка, вы можете создать URL к файлу с помощью вспомогательной функции PHPasset():

PHP
echo asset('storage/file.txt');

Драйвер local

При использовании драйвера local обратите внимание на то, что все файловые операции выполняются относительно каталога root, определенного в вашем конфигурационном файле. По умолчанию это каталог storage/app. Поэтому следующий метод сохранит файл в storage/app/file.txt:

PHP
Storage::disk('local')->put('file.txt''Contents');

Другие требования к драйверам

Перед использованием S3 или Rackspace вы должны установить соответствующие пакеты при помощи Composer:

  • Amazon S3: league/flysystem-aws-s3-v3 ~1.0
  • Rackspace: league/flysystem-rackspace ~1.0
+ 5.2

добавлено в 5.2 ()

Настройка драйвера FTP

Интеграция Flysystem отлично работает с FTP, но в стандартном файле настроек filesystems.php нет примера настройки FTP. Если вам надо настроить файловую систему FTP, вы можете использовать в качестве примера приведенные ниже настройки:

PHP
'ftp' => [
  
'driver'   => 'ftp',
  
'host'     => 'ftp.example.com',
  
'username' => 'ваш-логин',
  
'password' => 'ваш-пароль',

  
// Необязательные настройки FTP...
  // 'port'     => 21,
  // 'root'     => '',
  // 'passive'  => true,
  // 'ssl'      => true,
  // 'timeout'  => 30,
],

Настройка драйвера Rackspace

Интеграция Flysystem отлично работает с Rackspace, но в стандартном файле настроек filesystems.php нет примера настройки Rackspace. Если вам надо настроить файловую систему Rackspace, вы можете использовать в качестве примера приведенные ниже настройки:

PHP
'rackspace' => [
  
'driver'    => 'rackspace',
  
'username'  => 'ваш-логин',
  
'key'       => 'ваш-ключ',
  
'container' => 'ваш-контейнер',
  
'endpoint'  => 'https://identity.api.rackspacecloud.com/v2.0/',
  
'region'    => 'IAD',
  
'url_type'  => 'publicURL',
],

Основы использования

Получение экземпляров дисков

Для взаимодействия с любым из ваших сконфигурированных дисков можно использовать фасад Storage. Например, вы можете использовать метод этого фасада PHPput(), чтобы сохранить аватар на диск по умолчанию. Если вы вызовите метод фасада Storage без предварительного вызова метода PHPdisk(), то вызов метода будет автоматически передан диску по умолчанию:

PHP
<?php

namespace App\Http\Controllers;

use 
Storage;
use 
Illuminate\Http\Request;
use 
App\Http\Controllers\Controller;

class 
UserController extends Controller
{
  
/**
   * Обновить аватар данного пользователя.
   *
   * @param  Request  $request
   * @param  int  $id
   * @return Response
   */
  
public function updateAvatar(Request $request$id)
  {
    
$user User::findOrFail($id);

    
Storage::put(
      
'avatars/'.$user->id,
      
file_get_contents($request->file('avatar')->getRealPath())
    );
  }
}

При использовании нескольких дисков вы можете обращаться к нужному диску с помощью метода PHPdisk() фасада Storage. Само собой, в данном случае вы тоже можете использовать сцепку методов, для выполнения методов с указанным диском:

PHP
$disk Storage::disk('s3');

$contents Storage::disk('local')->get('file.jpg');

Чтение файлов

Методом PHPget() можно получать содержимое указанного файла. Он возвращает сырую строку содержимого файла:

PHP
$contents Storage::get('file.jpg');
+ 5.2 5.0

добавлено в 5.2 () 5.0 ()

Методом PHPexists() можно определить существование файла на диске:

PHP
$exists Storage::disk('s3')->exists('file.jpg');
+ 5.1

добавлено в 5.1 ()

Методом PHPhas() можно определить существование файла на диске:

PHP
$exists Storage::disk('s3')->has('file.jpg');
+ 5.2

добавлено в 5.2 ()

URL файла

При использовании драйвера local или s3 вы можете использовать метод PHPurl() для получения URL для файла. При использовании драйвера local в начало пути к файлу будет просто подставлено /storage, и будет возвращён относительный URL. При использовании драйвера s3 будет возвращён полный удалённый URL.

PHP
$url Storage::url('file1.jpg');

При использовании драйвера local не забудьте создать символьную ссылку в public/storage, которая указывает на папку storage/app/public.

Метаданные файла

Для получения размера файла в байтах служит метод PHPsize():

PHP
$size Storage::size('file1.jpg');

Для получения времени последней модификации файла (отметка времени UNIX) служит метод PHPlastModified():

PHP
$time Storage::lastModified('file1.jpg');

Запись файлов

Для записи файла на диск служит метод PHPput(). Также вы можете передать в метод PHPput() PHP-resource, чтобы использовать низкоуровневую поддержку потоков Flysystem. Очень рекомендуем использовать потоки при работе с большими файлами:

PHP
Storage::put('file.jpg'$contents);

Storage::put('file.jpg'$resource);

Метод PHPcopy() используется для копирования существующего файла в новое расположение на диске:

PHP
Storage::copy('old/file1.jpg''new/file1.jpg');

Метод PHPmove() используется для переименования или перемещения существующего файла в новое расположение:

PHP
Storage::move('old/file1.jpg''new/file1.jpg');

Добавление контента в начало / конец файла

Для вставки контента в начало или конец файла служат методы PHPprepend() и PHPappend():

PHP
Storage::prepend('file.log''Prepended Text');

Storage::append('file.log''Appended Text');
+ 5.2

добавлено в 5.2 ()

Видимость файлов

Получить и задать видимость можно методами PHPgetVisibility() и PHPsetVisibility(). Видимость — абстракция разрешений на файлы для использования на нескольких платформах:

PHP
Storage::getVisibility('file.jpg');

Storage::setVisibility('file.jpg''public');

Вдобавок, вы можете задать видимость при размещении файла методом PHPput(). Видимость задаётся значениями PHPpublic и PHPprivate:

PHP
Storage::put('file.jpg'$contents'public');

Удаление файлов

Метод PHPdelete() принимает имя одного файла или массив файлов для удаления с диска:

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

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

Папки

Получение всех файлов из папки

Метод PHPfiles() возвращает массив всех файлов из указанной папки. Если вы хотите получить массив всех файлов папки и её подпапок, используйте метод PHPallFiles():

PHP
$files Storage::files($directory);

$files Storage::allFiles($directory);

Получение всех подпапок

Метод PHPdirectories() возвращает массив всех папок из указанной папки. Вдобавок, вы можете использовать метод PHPallDirectories() для получения списка всех папок в данной папке и во всех её подпапках:

PHP
$directories Storage::directories($directory);

// рекурсивно...
$directories Storage::allDirectories($directory);

Создание папки

Метод PHPmakeDirectory() создаёт указанную папку, включая необходимые подпапки:

PHP
Storage::makeDirectory($directory);

Удаление директории

И наконец, метод PHPdeleteDirectory() удаляет папку с диска, включая все её файлы:

PHP
Storage::deleteDirectory($directory);

Пользовательские файловые системы

Laravel Flysystem предоставляет драйверы для нескольких «drivers» из коробки. Однако, Flysystem не ограничен ими и содержит в себе адаптеры для многих других систем хранения. Вы можете создать свой драйвер, если хотите использовать один из этих дополнительных адаптеров в вашем приложении Laravel.

Чтобы установить свою файловую систему, вы должны будете создать сервис-провайдер такой как DropboxServiceProvider. Для определения своего драйвера вы можете использовать метод PHPextend() фасада Storage в методе PHPboot() провайдера:

PHP
<?php

namespace App\Providers;

use 
Storage;
use 
League\Flysystem\Filesystem;
use 
Dropbox\Client as DropboxClient;
use 
Illuminate\Support\ServiceProvider;
use 
League\Flysystem\Dropbox\DropboxAdapter;

class 
DropboxServiceProvider extends ServiceProvider
{
  
/**
   * Выполнение после-регистрационной загрузки сервисов.
   *
   * @return void
   */
  
public function boot()
  {
    
Storage::extend('dropbox', function($app$config) {
      
$client = new DropboxClient(
        
$config['accessToken'], $config['clientIdentifier']
      );

      return new 
Filesystem(new DropboxAdapter($client));
    });
  }

  
/**
   * Регистрация привязок в контейнере.
   *
   * @return void
   */
  
public function register()
  {
    
//
  
}
}

Первый аргумент метода PHPextend() — имя драйвера, второй — замыкание, которое получает переменные PHP$app и PHP$config. Замыкание должно возвратить экземпляр League\Flysystem\Filesystem. Переменная PHP$config содержит значения, определенные в config/filesystems.php для указанного диска.

Когда вы создали сервис-провайдер для регистрации расширения, вы можете использовать драйвер dropbox в своём файле с настройками config/filesystem.php.

Написать комментарий

Разметка: ? ?

Авторизуйся, чтобы прокомментировать.