Normalizace koncovek uploadnutých obrázků
- Hellish
- Člen | 16
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
x – omylem jsem napsal komentář místo nového příspěvku
Editoval Folwik (3. 3. 2015 16:15)
- Jan Folwarczny
- Člen | 10
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)