• Czas czytania ~2 min
  • 29.02.2024

Niedawno miałem zadanie kolejki, które wymagało tymczasowego pobrania pliku na serwer, przetworzenia go i ostatecznego wyczyszczenia pliku tymczasowego. Nie jest to trudne w PHP i być może zacząłeś od czegoś takiego:

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

Aby uczynić go bardziej kompatybilnym z wieloma platformami, być może użyjesz wbudowanej sys_get_temp_dir() funkcji PHP, aby uzyskać ścieżkę katalogu używaną dla plików tymczasowych:

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

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

To wszystko jest w porządku; jednak Spatie ma prosty, ale skuteczny pakiet, który ładnie czyści ten standardowy kod za pomocą małego pakietu o nazwie spatie/temporary-directory. Omówiłem różne pakiety Spatie, ale ten mnie zaskoczył i jest jednym z moich ulubionych.

Ten pakiet jest jedną klasą (i dwiema klasami wyjątków) i zapewnia ładny, zorientowany obiektowo interfejs do tworzenia i zarządzania plikami tymczasowymi:

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

Korzystając z mojego przykładu przetwarzania pliku wideo, mogę łatwo pobrać plik do ścieżki tymczasowej za pomocą metody klienta sink() HTTP Laravela:

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! Mamy hermetyzowany, spójny sposób tworzenia katalogu tymczasowego i plików w nim zawartych oraz możliwość późniejszego czyszczenia. Spatie sprawia również, że czyszczenie jest jeszcze wygodniejsze, używając następującej metody podczas tworzenia obiektu:

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

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

Usunie deleteWhenDestroyed() katalog za pomocą metody obiektu __destruct() , więc nie musisz się martwić o późniejsze sprzątanie.

Ten pakiet ma inne udogodnienia, takie jak niestandardowa nazwa katalogu i lokalizacja oraz metoda opróżniania katalogu tymczasowego ze wszystkich plików. Dokumentację można zobaczyć w pliku readme projektu, znajdującym się w repozytorium na GitHub pod adresem spatie/temporary-directory.

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

O

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

O autorze CrazyBoy49z
WORK EXPERIENCE
Kontakt
Ukraine, Lutsk
+380979856297