2010-07-22 17 views

risposta

20

I bit iniziano con:

$JPEG = "\xFF\xD8\xFF" 
$GIF = "GIF" 
$PNG = "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a" 
$BMP = "BM" 
$PSD = "8BPS" 
$SWF = "FWS" 

Gli altri non saprei adesso, ma il grande 3 (jpeg, gif, png) di solito coprire il 99%. Quindi, confronta i primi byte con quella stringa e hai la tua risposta.

+1

Puoi dare un esempio di come verificherai questi dati rispetto ad alcuni dati binari usando php? grazie – DonutReply

+3

@DonutReply - solo per le persone che lo cercano: https://gist.github.com/CodeBrauer/5fe9ad14fa9786b3d1f6 – CodeBrauer

+1

Hai qualche informazione sugli ultimi bit per scoprire la fine di un'immagine? – Daniel

1

I file vengono caricati o si trovano già nel file system?

Provare a utilizzare mime_content_type() per ottenere il formato MIME del file.

0

Perché non controllare solo l'inclinazione del file? :)

alternativa

if(exif_imagetype($filepath) == IMAGETYPE_JPEG){ 
    echo 'This is a JPEG image'; 
} 
+7

Assolutamente inaffidabili. – Maerlyn

+0

Quindi la maggior parte dei file GIF in realtà non sono GIF? Non c'è davvero alcuna ragione per cui questo non funzionerebbe a meno che tu non abbia a che fare con i caricamenti degli utenti, e anche allora probabilmente non avrai nulla di cui preoccuparti. – Dutchie432

+0

Nel 2012, alcuni utenti credono di poter convertire le immagini semplicemente rinominando il file ... Quindi, non è affidabile. – djleop

6

Ecco un'implementazione della funzione come descritto da Wrikken

function getImgType($filename) { 
    $handle = @fopen($filename, 'r'); 
    if (!$handle) 
     throw new Exception('File Open Error'); 

    $types = array('jpeg' => "\xFF\xD8\xFF", 'gif' => 'GIF', 'png' => "\x89\x50\x4e\x47\x0d\x0a", 'bmp' => 'BM', 'psd' => '8BPS', 'swf' => 'FWS'); 
    $bytes = fgets($handle, 8); 
    $found = 'other'; 

    foreach ($types as $type => $header) { 
     if (strpos($bytes, $header) === 0) { 
      $found = $type; 
      break; 
     } 
    } 
    fclose($handle); 
    return $found; 
} 
0

Utilizzare l'estensione fileinfo PHP:

http://de.php.net/manual/en/function.finfo-file.php

sua utilizzando il "file" * di comando nix per determinare in modo affidabile il mimo -tipo di un file specificato:

$finfo = finfo_open(FILEINFO_MIME_TYPE); 
$mimetype = finfo_file($finfo, $filename); 
finfo_close($finfo); 

Questa estensione è fornita con PHP 5.3 o può essere installata da pecl (pecl install fileinfo) per le versioni precedenti.

25

Posso capire che la maggior parte di voi non ha compreso la domanda :) (la domanda era come convalidare i dati binari nel buffer, non un file sul disco).

ho avuto lo stesso problema, e risolto con:

$finfo = new finfo(FILEINFO_MIME_TYPE); 
$finfo->buffer($rawImage); 
+1

Questa soluzione è la migliore, se si utilizza PHP> 5.3 – djleop

+0

Questo dovrebbe essere in realtà sopra le mie con lo stato attuale di PHP, il 5.3 sta invecchiando. – Wrikken

+0

Qual è il formato della stringa che restituirà? –