• Час читання ~1 хв
  • 29.02.2024

Нещодавно у мене було завдання в черзі, яке потрібно було тимчасово завантажити файл на сервер, обробити його і, нарешті, очистити тимчасовий файл. Це не складно в PHP, і ви, можливо, почали з чогось на кшталт наступного:

file_put_contents('/tmp/' . $tmpFile, file_get_contents($video));

Щоб зробити його більш кросплатформним, можливо, ви б використали вбудовану sys_get_temp_dir() функцію PHP, щоб отримати шлях до каталогу, який використовується для тимчасових файлів:

$basePath = rtrim(sys_get_temp_dir(), DIRECTORY_SEPARATOR);
$tmpPath = $basePath.$tmpFile;

// Download the file
// Process it
// Clean up

Це все добре; однак, Spatie має простий, але ефективний пакет, який чудово очищає цей шаблонний код за допомогою невеликого пакунка під назвою spatie/temporary-directory. Я розглянув різні пакети Spatie, але цей мене здивував і є одним із моїх улюблених.

Цей пакет є одним класом (і двома класами-винятками) і надає гарний об'єктно-орієнтований інтерфейс для створення та управління тимчасовими файлами:

use Spatie\TemporaryDirectory\TemporaryDirectory;

$tmpDir = (new TemporaryDirectory())->create();

// Or using the make() static constructor
$tmpDir = TemporaryDirectory::make();

// Return a path inside the temporary directory
$tmpDir->path('659c896e52a29.mov');
// return /tmp/490784976-0213323001704757672/659c896e52a29.mov

Використовуючи мій приклад обробки відеофайлу, я можу легко завантажити файл на тимчасовий шлях за допомогою методу HTTP-клієнта sink() Laravel:

use Illuminate\Support\Facades\Http;
use Spatie\TemporaryDirectory\TemporaryDirectory;

// Normalize the video and get the filename
$videoUrl = str($videoUrl)->replace(' ', '%20');
$tmpFile = $videoUrl->afterLast('/');

// Create a temporary directory and download a file to that path
$tmpDir = TemporaryDirectory::make();
$tmpPath = $tmpDir->path($tmpFile);
Http::sink($tmpPath)->throw()->get($videoUrl->toString());

// Process the file
// Cleanup the temporary file
$tmpFile->delete();

Neat! У нас є інкапсульований, послідовний спосіб створення тимчасового каталогу та файлів у ньому, а також можливість очищення після цього. Spatie також робить очищення ще зручнішим, використовуючи наступний метод під час створення об'єкта:

$tmpDir = (new TemporaryDirectory())
    ->deleteWhenDestroyed()
    ->create();

// Or via `make()`
$tmpDir = TemporaryDirectory::make()->deleteWhenDestroyed();

The deleteWhenDestroyed() видалить каталог за допомогою методу об'єкта __destruct() , тому вам не доведеться турбуватися про подальше очищення.

Цей пакунок має інші зручності, такі як власне ім'я та розташування каталогу, а також метод очищення тимчасового каталогу від усіх файлів. Ви можете переглянути документацію в readme проєкту, розташованому в репозиторії на GitHub за адресою spatie/temporary-directory.

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

Про мене

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

Про автора CrazyBoy49z
WORK EXPERIENCE
Контакти
Ukraine, Lutsk
+380979856297