Normalizace koncovek uploadnutých obrázků

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Hellish
Člen | 16
+
0
-

Ahoj,

dělám na aplikaci, kam uživatelé nahrávají své fotky. Název uploadnutého souboru není nijak podstatný a tak obrázky ukládám (mimo www root) v podobě userId/photoId.koncovka

Hledám nejsnažší cestu, jak vygenerovat názvy souborů s konzistentními koncovkami, abych neměl jednou .jpg, podruhé .jpeg, potřetí .JPG atd.

Napadlo mě, že bych koncovku nastavoval přímo podle mime typu. Samozřejmě až poté, co bych ověřil, že jde skutečně o obrázek. Tzn. že i když někdo pošle jpeg obrázek v souboru, který má koncovku třeba .brambora, uložil bych si ho s koncovkou .jpg.

Co myslíte, je to dobrý nápad? Není někde v Nette nějaká mapovací „tabulka“ pro vazby mezi mime typem a příponou? Resp. jak to co nejjednodušeji implementovat v Nette? Překvapilo mě, že HttpUploadedFile neumí vrátit zvlášť název souboru a jeho koncovku. Musím si to rozparsovat sám, nebo je na to nějaká šikovná funkce?

Jak řešíte názvy uploadnutých souborů vy?

Díky za odpovědi.

Jan Folwarczny
Člen | 10
+
0
-

x – omylem jsem napsal komentář místo nového příspěvku

Editoval Folwik (3. 3. 2015 16:15)

Jan Folwarczny
Člen | 10
+
+5
-

Ahoj, já bych to řešil takto:

/**
 * @var \Nette\Http\FileUpload $fileUpload
 * @var int $userId
 * @var int $photoId
 */

if (!is_array($imageSize = @getimagesizefromstring($fileUpload->getContents())))
   throw new \Exception('Not an image.');

$extension = image_type_to_extension($imageSize[2]);
$filepath = $userId . '/' . $photoId . '.' . $extension;

nebo takto:

/**
 * @var \Nette\Http\FileUpload $fileUpload
 * @var int $userId
 * @var int $photoId
 */

if (!$fileUpload->isImage())
    throw new \Exception('Not an image.');

switch ($fileUpload->getContentType()) {
    case 'image/gif': $extension = 'gif'; break;
    case 'image/png': $extension = 'png'; break;
    case 'image/jpeg': $extension = 'jpeg'; break;
    default: throw new \Exception('Unknown image content type.');
}

$filepath = $userId . '/' . $photoId . '.' . $extension;

Editoval Folwik (3. 3. 2015 16:16)

Hellish
Člen | 16
+
0
-

Ha, nevěděl jsem, že přímo v PHP je funkce image_type_to_extension.

Díky!

mpis
Člen | 65
+
-7
-

Dobré řešení.
Ale to lomítko v názvu souboru už tak dobrý nápad není.

Jan Mikeš
Člen | 771
+
0
-

Jake lomitko v nazvu souboru? userId je snad adresar ne? :)

akadlec
Člen | 1326
+
0
-

jestli používáš tu moji knihovnu, tak je tam k dispozici i zjištěni mimetype na zakladě koncovky a případně by to mělo jít i reverzne