Понимание и работа с файлами в Laravel

Самуэль Олорунтоба @KayandraJT

0 комментариев Просмотры

Загрузка файлов – одна из наиболее часто используемых функций в Интернете. Мы не можем обойтись без файлов в Интернете – от загрузки аватаров, семейных фотографий до отправки документов по электронной почте.

В сегодняшней статье будут рассмотрены все способы обработки файлов в Laravel. Если вы новичок в Laravel, просмотрите курсы или перейдите в раздел руководств. После прочтения статьи, если мы что-то упустили, сообщите нам об этом в комментариях, и мы соответствующим образом обновим сообщение.

Обработка файлов – это еще одна вещь, которую Laravel упростил в своей экосистеме. Прежде чем мы начнем, нам понадобится несколько вещей. Во-первых, проект Laravel. Есть несколько способов создать новый проект Laravel, но давайте пока остановимся на композиторе.

Содержание

  • Понимание того, как Laravel обрабатывает файлы
  • Загрузка файлов в Laravel
  • Разница между локальными и общедоступными дисками
  • Загрузка нескольких файлов
  • Проверка загрузки файлов
  • Перемещение файлов в облако
  • Отправка файлов в виде вложений электронной почты
  • Фасад хранилища для файлов, когда файлы Уже существует
  • Управление файлами
  • Не забывайте каталоги
  • Заключение
  composer create-project --prefer-dist laravel/laravel files  

Где files – это имя наш проект. После установки приложения нам потребуется установить несколько пакетов, так что давайте избавимся от них. Обратите внимание, что эти пакеты необходимы только в том случае, если вы собираетесь сохранять изображения в Amazon s3 или манипулировать изображениями, такими как обрезка, фильтры и т. Д.

  composer require league/flysystem-aws-s3  -v3: ~ 1.0 вмешательство/изображение: ~ 2.4  

После установки зависимостей последний из них – Mailtrap. Mailtrap – это поддельный SMTP-сервер, предназначенный для групп разработчиков для тестирования, просмотра и обмена электронными письмами, отправленными из сред разработки и промежуточных сред, без рассылки спама реальным клиентам. Так что перейдите в Mailtrap и создайте новый почтовый ящик для тестирования.

Затем в welcome.blade. php обновите тег заголовка на:

      Загрузка файлов   * {font-family: -apple-  system, BlinkMacSystemFont, «Segoe UI», Roboto, «Helvetica Neue», Arial, без засечек, «Apple Color Emoji», «Segoe UI Emoji», «Segoe UI Symbol»;  }   

Измените содержимое тела на:

   

{{csrf_field ()}}

Для формы загрузки файла enctype = "multipart/form-data " и method =" POST " чрезвычайно важны, поскольку браузер знает, как правильно форматировать запрос. {{csrf_field ()}} является специфичным для Laravel и генерирует скрытое поле ввода с токеном, который Laravel может использовать для проверки правильности отправки формы.

Если токен CSRF не существует на странице, Laravel покажет страницу «Срок действия страницы истек из-за неактивности».

Теперь, когда у нас есть наши зависимости, давайте приступим.

Понимание того, как Laravel обрабатывает файлы

Развитие в том виде, в каком мы его знаем в 2018 году, быстро растет, и в большинстве случаев существует множество решений одной проблемы. Возьмем, к примеру, файловый хостинг: теперь у нас так много вариантов для хранения файлов, огромное количество решений, начиная от собственного хостинга и заканчивая FTP, облачным хранилищем и GFS и многими другими.

Поскольку Laravel – это фреймворк, который поощряет гибкость, у него есть собственный способ обработки множества файловых структур. Будь то локальный, Amazon s3, Google Cloud, Laravel поможет вам.

Решение этой проблемы в Laravel – называть их дисками. Имеет смысл, любую систему хранения файлов, о которой вы можете подумать, можно обозначить как диск в Laravel. В связи с этим Laravel имеет встроенную поддержку некоторых поставщиков (дисков). У нас есть: local, public, s3, rackspace, FTP и т. Д. Все это возможно благодаря Flysystem.

Если вы откроете config/filesystems.php , вы ‘ Я увижу доступные диски и их конфигурацию.

Загрузка файлов в Laravel

Из введенного выше раздела у нас есть форма с вводом файла, готовая к обработке . Мы видим, что форма указывает на/process. В routes/web.php мы определяем новый маршрут POST/process.

  используйте Illuminate  Http  Request; Route :: post ('process', function (Request $ request) {$ path = $ request-> file ('photo')  -> store ('photos'); dd ($ path);});  

Приведенный выше код захватывает поле фотографии из запроса и сохраняет его в фотографиях. папка. dd () – это функция Laravel, которая убивает запущенный скрипт и выгружает аргумент на страницу. Для меня файл был сохранен в «photos/3hcX8yrOs2NYhpadt4Eacq4TFtpVYUCw6VTRJhfn.png». Чтобы найти этот файл в файловой системе, перейдите в хранилище/приложение, и вы найдете загруженный файл.

Если вам не нравится шаблон именования по умолчанию, предоставляемый Laravel, вы можете предоставить свой с помощью метода storeAs.

  Route :: post ('process', function (Request $ request) {//кешируем файл $ file = $ request-> file ('  photo ');//генерируем новое имя файла. getClientOriginalExtension () для расширения файла $ filename =' profile-photo- '. time ().'. '. $ file-> getClientOriginalExtension ();//сохраняем в хранилище/ app/photos в качестве нового $ filename $ path = $ file-> storeAs ('photos', $ filename); dd ($ path);});  

После запуска приведенный выше код, у меня есть “photos/profile-photo-1517311378.png”.

Разница между локальными и общедоступными дисками

В config/filesystems.php вы можете увидеть определены диски локальные и публичные. По умолчанию Laravel использует конфигурацию локального диска. Основное различие между локальным и общедоступным дисками заключается в том, что локальный диск является частным, и к нему нельзя получить доступ из браузера, в то время как общедоступный может быть доступен из браузера.

Поскольку общий диск находится в хранилище/app/public и Корень сервера Laravel находится в открытом доступе, вам нужно связать storage/app/public с общей папкой Laravel. Мы можем сделать это с помощью нашего верного мастера, запустив php artisan storage: link.

Загрузка нескольких файлов

Поскольку Laravel не предоставляет функции для загрузки нескольких файлов, нам нужно сделать это самим. Это не сильно отличается от того, что мы делали до сих пор, нам просто нужен цикл.

Во-первых, давайте обновим ввод для загрузки файла, чтобы он принимал несколько файлов.

    

Когда мы пытаемся обработать этот файл $ request-> (‘photos’), теперь он представляет собой массив экземпляров UploadedFile, поэтому нам нужно выполнить цикл массив и сохраните каждый файл.

  Route :: post ('process', function (Request $ request) {$ photos = $ request-> file ('photos')  ; $ paths = []; foreach ($ photos as $ photo) {$ extension = $ photo-> getClientOriginalExtension (); $ filename = 'profile-photo-'. time (). '.'. $ extension; $ paths  [] = $ photo-> storeAs ('photos', $ filename);} dd ($ paths);});  

После запуска я получил следующий массив, так как я загрузил GIF и PNG:

  массив: 2 [▼ 0 => "photos/profile-photo-1517315875. gif "1 =>" photos/profile-photo-1517315875.png "]  

Проверка загрузки файлов

Проверка загрузки файлов чрезвычайно важна. Помимо предотвращения загрузки пользователями файлов неправильных типов, это также для безопасности. Позвольте мне привести пример, касающийся безопасности. Есть параметр конфигурации PHP cgi.fix_pathinfo = 1. Что он делает, так это когда он встречает файл вроде https://site .com/images/evil.jpg/nonexistent.php, PHP предположит, что nonexistent.php – это файл PHP, и попытается его запустить. Когда он обнаружит, что nonexistent.php не существует, PHP будет такой: «Мне нужно чтобы исправить это как можно скорее »и попробуйте запустить evil.jpg (файл PHP, замаскированный под JPEG). Поскольку evil.jpg не был проверен при загрузке, у хакера теперь есть сценарий, который он может свободно запускать на вашем сервере в реальном времени … Не… хорошо.

Есть много способов проверить файлы в Laravel, но давайте остановимся на проверке контроллера.

  Route :: post  ('process', function (Request $ request) {//проверяем загрузку  добавленный файл $ validation = $ request-> validate (['photo' => 'required | file | image | mimes: jpeg, png, gif, webp | max: 2048'//для загрузки нескольких файлов//'photo. *  '=>' требуется | файл | изображение | mimes: jpeg, png, gif, webp | max: 2048 ']);  $ file = $ validation ['фото']; //получаем проверенный файл $ extension = $ file-> getClientOriginalExtension ();  $ filename = 'фото профиля-'.  время ().  '.'  .  $ extension;  $ path = $ file-> storeAs ('фотографии', $ filename);  dd ($ path);});  

Для приведенного выше фрагмента мы сказали Laravel убедиться, что поле с именем фотографии является обязательным, это успешно загруженный файл, image, он имеет один из определенных типов mime, и его максимальный размер составляет 2048 килобайт ~~ 2 мегабайта.

Теперь, когда злонамеренный пользователь загружает замаскированный файл, файл не пройдет проверку, и если по какой-то странной причине вы оставляете cgi.fix_pathinfo включенным, это не средство, с помощью которого вы можете получить PWNED !!!

Если вы перейдете на страницу проверки Laravel, вы увидите целую кучу правила проверки.

Перенос файлов в облако

Итак, ваш сайт стал взрослым, на нем много посетителей, и вы решили, что пора перейти в облако. Или, может быть, с самого начала вы решили, что ваши файлы будут храниться на отдельном сервере. Хорошая новость заключается в том, что Laravel поддерживает множество облачных провайдеров, но в этом руководстве мы будем использовать Amazon.

Ранее мы установили league/flysystem-aws-s3-v3 через composer. Laravel будет автоматически искать его, если вы решите использовать Amazon S3 или выбросите исключение.

Чтобы загрузить файлы в облако, просто используйте:

  $ request-> file ('photo') -> store ('photos', 's3');  

Для загрузки нескольких файлов:

  foreach ($ photos as $ photo) {$ extension = $ photo-> getClientOriginalExtension ();  $ filename = 'фото профиля-'.  время ().  '.'. $ extension;  $ paths [] = $ photo-> storeAs ('photos', $ filename, 's3');}  

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

Примечание: вам нужно будет настроить свои учетные данные Amazon s3 в config/filesystems.php ** . **

Отправка файлов в виде вложений электронной почты

Прежде чем мы это сделаем, давайте быстро настроим наши почтовая среда. В файле .env вы увидите этот раздел

  MAIL_DRIVER = smtpMAIL_HOST = smtp.mailtrap.ioMAIL_PORT = 2525MAIL_USERNAME = nullMAIL_PASSWORD = nullMAIL_ENCRYPTION = null  

Нам нужны имя пользователя и пароль, которые мы можем получить на Mailtrap.io. Mailtrap действительно хорош для тестирования электронной почты во время разработки, поскольку вам не нужно забивать электронную почту спамом. Вы также можете предоставить общий доступ к почтовым ящикам для членов команды или создать отдельные почтовые ящики.

Сначала создайте учетную запись и войдите в систему:

  1. Создайте новый почтовый ящик
  2. Щелкните, чтобы открыть папку “Входящие”
  3. Скопировать имя пользователя и пароль в разделе SMTP

После копирования учетных данных мы можем изменить .env на:

  MAIL_DRIVER = smtpMAIL_HOST = smtp.mailtrap.ioMAIL_PORT = 2525MAIL_USERNAME = 8a1d546090493bMAIL_PASSWORD5 = 328cd   

Не пытайтесь использовать мой, я удалил его.

Создайте свой почтовый ящик

   php artisan make: mail FileDownloaded  

Затем отредактируйте его метод сборки и измените его на:

  public function build () {  вернуть $ this-> from ('files@mailtrap.io ') -> view (' emails.files_downloaded ') -> attach (storage_path (' app/file.txt '), [' as '=>' secret.txt  ']);}  

Как видно из приведенного выше метода, мы передаем абсолютный путь к файлу методу attach () и передаем необязательный массив, где re мы можем изменить имя вложения или даже добавить собственные заголовки. Затем нам нужно создать представление электронной почты.

Создайте новый файл представления в resources/views/emails/files_downloaded.blade.php и поместите его содержимое ниже.

   

Только вы можете остановить лесные пожары

Lorem, ipsum dolor sit amet conctetur adipisicing elit. Трудитесь при reiciendis consquatur, ea culpa molestiae ad minima est quibusdam ducimus labouriosam dolorem, quasi sequi! Atque dolore ullam nisi accusantium. Tenetur!

Теперь в routes/web.php мы можем создать новый маршрут и отправлять почту при посещении.

  используйте App  Mail  FileDownloaded;  
  Route :: get ('mail', function () {$ email = 'bruce.  wayne@batcave.io '; Mail :: to ($ email) -> send (new FileDownloaded); dd (' done ');});  

Если вы перейдете в Mailtrap, вы должны это увидеть.

Фасад хранилища для случаев, когда файлы уже существуют

В приложении мы не каждый раз обрабатываем файлы посредством загрузки. Иногда мы решаем отложить облачный файл загружается до тех пор, пока не будет выполнено определенное действие пользователя. В других случаях у нас есть некоторые файлы на диске перед переключением на облачного провайдера. Для таких случаев Laravel предоставляет удобный фасад хранилища. Для тех, кто не знает, фасады в Laravel являются псевдонимами классов .Поэтому вместо того, чтобы делать что-то вроде Symfony File Whatever Long Namespace UploadedFile, мы можем вместо этого сделать Storage.

Выбор диска для загрузки файла. Если диск не указан, Laravel просматривает config/filesystems.php и использовать диск по умолчанию.

  Storage :: disk ('local') -> exists ('file.txt');  

использовать облачного провайдера по умолчанию

 //Storage :: disk ('cloud') -> exists ('file.txt'); не будет  работать так и делать: Storage :: cloud () -> exists ('file.txt');  

Создать новый файл с содержимым

  Storage :: put ('file.txt  ',' Contents ');  

Prepend to file

  Storage :: prepend (' file.txt ',' Prepended  Текст ');  

Добавить в файл

  Storage :: append (' file.txt ',' Prepended Text ')  ;  

Получить содержимое файла

  Storage :: get ('file.txt')  

Проверить, существует ли файл

  Storage :: exists ('file.txt')  

Принудительная загрузка файла

  Storage :: download ('file.txt', $ name, $ headers); //$ name и $ headers являются необязательными  

Создание общедоступного URL

  Storage :: url ('file.txt'  );  

Создать временный общедоступный URL-адрес (т.е. файлы, которые не будут существовать по прошествии установленного времени). Это будет работать только для облачных провайдеров, поскольку Laravel еще не знает, как обрабатывать создание временных URL-адресов для локального диска.

  Storage ::poraryUrl ('file.txt',  now () -> addMinutes (10));  

Получить размер файла

  Storage :: size ('file.txt  ');  

Дата последнего изменения

  Storage :: lastModified (' file.txt ')  

Копировать файлы

  Storage :: copy ('file.txt', 'shared/file.txt');  

Перемещение файлов

  Storage :: move ('file.txt', 'secret/file.txt');  

Удалить файлы

  Storage :: delete ('file.txt');  
 //для удаления нескольких файлов Storage :: delete (['file1.txt', 'file2.txt']);  

Управление файлами

Изменение размера изображений, добавление фильтров и т. Д. Вот где Laravel нужна внешняя помощь. Добавление этой функции в Laravel только приведет к раздуванию приложения, поскольку оно не требуется для установки. Нам нужен пакет под названием «вмешательство/изображение». Мы уже установили этот пакет, но для справки.

  композитору требуется вмешательство/изображение  

Поскольку Laravel может автоматически обнаруживать пакеты, нам не нужно ничего регистрировать. Если вы используете версию Laravel ниже 5.5, прочтите это.

Чтобы изменить размер изображения

  $ image = Image :: make (storage_path  ('app/public/profile.jpg')) -> resize (300, 200);  

Даже пакеты Laravel работают свободно.

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

Не забывайте каталоги

Laravel также предоставляет удобных помощников для работа с каталогами. Все они основаны на итераторах PHP, поэтому обеспечивают максимальную производительность.

Чтобы получить все файлы:

  Storage :: files  

Чтобы получить все файлы в каталоге, включая файлы в подпапках

  Storage :: allFiles ($ directory_name);  

Чтобы получить все каталоги внутри каталога

  Storage :: directoryies ($ directory_name);  

Чтобы получить все каталоги в каталоге, включая файлы в подкаталогах

  Storage :: allDirectories ($ directory_name);  

Создать каталог

  Storage :: makeDirectory ($ directory_name);  

Удалить каталог

  Storage :: deleteDirectory ($ directory_name);  

Заключение

Если мы что-то упустили, сообщите нам вниз в комментариях. Кроме того, проверьте Mailtrap, они действительно хороши и помогут вам пройти этап разработки в отношении отладки электронных писем.

Понравилась эта статья? Следите за @KayandraJT в Twitter

Читать дальше …

Оцените статью
futurei.ru
Добавить комментарий