Wat is de beste manier om te bepalen of een bestand een afbeelding is in PHP?

Ik heb een server waar mensen bestanden naartoe kunnen uploaden. Het probleem is dat sommige bestandsnamen verminkt zijn (geen enkele extensie) en dus kan ik niet meteen het bestandstype bepalen. Deze vraag bestaat voor een deel uit: voor de bestanden die bestandsnamen hebben, wat is de beste manier om te bepalen of het een afbeelding is of niet? (Gewoon een grote lange if/else if-lijst?) Ten tweede, voor de bestanden die geen extensies hebben, hoe kan ik bepalen of het afbeeldingen zijn?

2
PHP "> stackoverflow.com/questions/676949/…
toegevoegd de auteur Mob, de bron
mime_content_type ()
toegevoegd de auteur user557846, de bron

12 antwoord

You can use exif_imagetype()

<?php
    $type =exif_imagetype($image);

waar $ type een waarde is

  1. IMAGETYPE_GIF
  2. IMAGETYPE_JPEG
  3. IMAGETYPE_PNG
  4. IMAGETYPE_SWF
  5. IMAGETYPE_PSD
  6. IMAGETYPE_BMP
  7. IMAGETYPE_TIFF_II (byte-volgorde van intel bytes)
  8. IMAGETYPE_TIFF_MM (bestelling voor motorola-byte)
  9. IMAGETYPE_JPC
  10. IMAGETYPE_JP2
  11. IMAGETYPE_JPX
  12. IMAGETYPE_JB2
  13. IMAGETYPE_SWC
  14. IMAGETYPE_IFF
  15. IMAGETYPE_WBMP
  16. IMAGETYPE_XBM
  17. IMAGETYPE_ICO

Uit de handleiding:

Wanneer een juiste handtekening wordt gevonden, wordt de juiste constante waarde geretourneerd, anders is de geretourneerde waarde ONWAAR. De retourwaarde is dezelfde waarde die getimagesize() retourneert in index 2, maar exif_imagetype() is veel sneller.

5
toegevoegd
Dit is ook een foutmelding: "Lees fout!"
toegevoegd de auteur chacham15, de bron
In PHP kunt u foutmeldingen onderdrukken met @: @exif_imagetype ()
toegevoegd de auteur macjohn, de bron

You can use getimagesize It does not require the GD image library and it returns same information about image type. http://it2.php.net/manual/en/function.getimagesize.php

4
toegevoegd
dit zal een fout genereren als het geen afbeelding is
toegevoegd de auteur chacham15, de bron
@chacham - Het is geen fout, het is slechts een waarschuwing. De functie retourneert false als het bestand ongeldig is, een moet controleren met getimagesize ($ filename) === false .
toegevoegd de auteur martinstoeckli, de bron
U kunt @getimagesize ('naam van bestand') gebruiken om WAARSCHUWING voor niet-afbeeldingbestanden te onderdrukken
toegevoegd de auteur InuYaksa, de bron

Je hebt hier twee opties, de een is eenvoudig en vooraf gebouwd met enkele tekortkomingen, de andere is complex en vereist wiskunde.

PHP's fileinfo can be used to detect file types based on the file's actual header information. For instance, I just grabbed your gravitar:

enter image description here

Maar de echte code is dit:

‰PNG


IHDR  szzô
IDATX…­—OL\UÆZÀhëT)¡    c•1T:1‘Š‘.Ú(]4†A“ÒEY˜à.................................

Dus zelfs zonder de bestandsnaam kon ik het duidelijk detecteren. Dit is wat de extensie PHP Fileinfo zal doen. De meeste PNG- en JPG-bestanden hebben deze header meestal, maar dit is niet het geval voor elk afzonderlijk bestandstype.

Dat gezegd hebbende, fileinfo is doodeenvoudig in gebruik, uit de handleiding:

$fi = new finfo(FILEINFO_MIME,'/usr/share/file/magic');
$mime_type = $fi->buffer(file_get_contents($file));

Je andere optie is complexer en het hangt af van je eigen persoonlijke ambities, je zou een histogram kunnen genereren en profielbestanden op basis van hun inhoud .

Dit lijkt op een GIF-bestand:

enter image description here

En zoiets lijkt op een TIFF-bestand:

enter image description here

Van daaruit zou je een model over meerdere typen bestanden moeten genereren voor wat het histogram van elk type zou moeten zijn, en dat vervolgens gebruiken om te raden. Dit is een goede methode om te gebruiken voor bestanden die niet echt die "magische headers" hebben die gemakkelijk kunnen worden gelezen. Houd er rekening mee dat je wat wiskunde moet leren en een gemiddelde histogramfunctie moet modelleren en ze moet vergelijken met bestanden.

2
toegevoegd
Ik raad aan om dit antwoord ook op de 'originele' vraag te plaatsen, omdat het er een stuk beter uitziet dan de bestaande
toegevoegd de auteur Ivo Flipse, de bron

Als u de GD2-extensie hebt ingeschakeld, kunt u die gebruiken om het bestand als een afbeelding te laden en vervolgens als het ongeldig wordt geretourneerd, kunt u de fout opvangen en FALSE retourneren, anders retourneert u WAAR.

2
toegevoegd

U kunt proberen de afbeelding in de GD-bibliotheek van PHP te laden en zien of deze werkt.

$file = file_get_contents('file');
$img = imagecreatefromstring($file);
if($img === FALSE){
 //file is NOT an image
}
else{
 //file IS an image
}
1
toegevoegd

For the first question is extension is known you could use the PHP function in_array() Documentation

1
toegevoegd
Hoe, helpt dit precies?
toegevoegd de auteur Rocket Hazmat, de bron

exif_imagetype() werkt mogelijk

zorg ervoor dat je exif hebt ingeschakeld.

1
toegevoegd

Kijk naar beeldmagie identificeren. http://www.imagemagick.org/script/identify.php

The PHP wrapper is here: http://www.php.net/manual/en/function.imagick-identifyimage.php

Or if you just want to validate that it's an image (and don't care about the meta data): http://www.php.net/manual/en/function.imagick-valid.php

1
toegevoegd

Probeer exif_imagetype te bekijken

0
toegevoegd

Het type afbeelding van de afbeelding kan meestal worden afgeleid uit de headerinformatie van het bestand.

0
toegevoegd

You can use the Fileinfo extension: http://www.php.net/manual/en/function.finfo-file.php

finfo_file() gebruikt magische bytes en hoeft niet de hele afbeelding in het geheugen te laden. Het resultaat is een string met het overeenkomstige MIME-type, bijvoorbeeld:

  • text/html
  • image/gif
  • application/vnd.ms-excel
0
toegevoegd

Als u een snelle oplossing nodig hebt, gebruikt u imagesx() en imagesy (). Er is ook een snelle manier om grote afbeeldingsafmetingen te controleren door slechts een kleine hoeveelheid gegevens uit de bestandskop te lezen. In meer detail uitgelegd in de volgende URL:

http://hungred.com/useful-information/php-fastest- beeld-breedte-hoogte/

0
toegevoegd