Domanda

Ok, quindi ho un file index.php che deve elaborare molti tipi di file diversi. come indovino il tipo di file basato sul REQUEST_URI .

Se richiedo http: //site/image.jpg e tutte le richieste reindirizzano tramite index.php, che assomiglia a questo

<?php
   include('/www/site'.

Ok, quindi ho un file index.php che deve elaborare molti tipi di file diversi. come indovino il tipo di file basato sul REQUEST_URI .

Se richiedo http: //site/image.jpg e tutte le richieste reindirizzano tramite index.php, che assomiglia a questo

<*>

Come potrei farlo funzionare correttamente?

Devo testare in base all'estensione del file richiesto o c'è un modo per ottenere il tipo di file?

SERVER['REQUEST_URI']); ?>

Come potrei farlo funzionare correttamente?

Devo testare in base all'estensione del file richiesto o c'è un modo per ottenere il tipo di file?

È stato utile?

Soluzione

Se sei sicuro di lavorare sempre con le immagini, puoi dare un'occhiata al getimagesize () exif_imagetype () funzione PHP, che tenta di restituire l'immagine di tipo MIME.

Se non ti dispiace dipendenze esterne, puoi anche consultare l'eccellente libreria getID3 che può determinare il tipo mime di molti tipi di file diversi.

Infine, puoi consultare mime_content_type () ma è stata deprecata per l'estensione Fileinfo PECL.

Altri suggerimenti

mime_content_type () è obsoleto, quindi non potrai contare su di esso funzionando in futuro. C'è un " fileinfo " Estensione PECL, ma non ho sentito cose positive al riguardo.

Se stai eseguendo un server * nix, puoi fare quanto segue, che ha funzionato bene per me:

$file = escapeshellarg( $filename );
$mime = shell_exec("file -bi " . $file);
$filename should probably include the absolute path.
function get_mime($file) {
  if (function_exists("finfo_file")) {
    $finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension
    $mime = finfo_file($finfo, $file);
    finfo_close($finfo);
    return $mime;
  } else if (function_exists("mime_content_type")) {
    return mime_content_type($file);
  } else if (!stristr(ini_get("disable_functions"), "shell_exec")) {
    // http://stackoverflow.com/a/134930/1593459
    $file = escapeshellarg($file);
    $mime = shell_exec("file -bi " . $file);
    return $mime;
  } else {
    return false;
  }
}

Per me, nulla di tutto ciò funziona - mime_content_type è deprecato, finfo non è installato e shell_exec non è consentito.

In realtà sono stato stufo della mancanza di standard metodi di sniffing MIME in PHP. Installa fileinfo ... Usa funzioni deprecate ... Oh, queste funzionano, ma solo per le immagini! Me ne sono stufato, quindi ho fatto qualche ricerca e ho trovato le WHATWG Mimesniffing spec - Credo che questo è comunque una bozza di specifiche.

Comunque, usando questa specifica, sono stato in grado di implementare un mimesniffer in PHP. Le prestazioni non sono un problema. In effetti sulla mia umile macchina, sono stato in grado di aprire e annusare migliaia di file prima del timeout di PHP.

Ecco la Classe MimeReader .

require_once("MimeReader.php");

$mime = new MimeReader(<YOUR FILE PATH>);
$mime_type_string = $mime->getType();     // "image/jpeg" etc.

Se lavori solo con Immagini e hai bisogno del tipo MIME (ad es. per le intestazioni), questa è la risposta più veloce e diretta:

$file = 'path/to/image.jpg';
$image_mime = image_type_to_mime_type(exif_imagetype($file));

Produrrà il vero tipo mime di immagine anche se rinominerai il tuo file di immagine

Secondo il manuale di php, il finfo-file La funzione è il modo migliore per farlo. Tuttavia, dovrai installare l'estensione FileInfo PECL.

Se l'estensione non è un'opzione, puoi utilizzare la funzione mime_content_type obsoleta.

mime_content_type () sembra essere la strada da percorrere, nonostante i commenti di cui sopra affermino che è deprecato. Non è - o almeno questa incarnazione di mime_content_type () non è deprecata, secondo http://php.net/manual/en/function.mime-content-type.php . Fa parte dell'estensione FileInfo, ma la documentazione di PHP ora ci dice che è abilitato di default a partire da PHP 5.3.0.

Puoi usare finfo per farlo a partire da PHP 5.3:

<?php
$info = new finfo(FILEINFO_MIME_TYPE);
echo $info->file('myImage.jpg');
// prints "image/jpeg"

Il flag FILEINFO_MIME_TYPE è facoltativo; senza di essa si ottiene una stringa più dettagliata per alcuni file; (apparentemente alcuni tipi di immagine restituiranno informazioni su dimensioni e profondità del colore). L'uso del flag FILEINFO_MIME restituisce il tipo mime e la codifica se disponibile (ad es. Image / png; charset = binary o text / x-php; charset = us-ascii). Vedi questo sito per maggiori informazioni.

Non l'ho usato, ma c'è un'estensione estensione PECL per ottenere il mimetype di un file . La documentazione ufficiale è in il manuale .

A seconda dei tuoi scopi, un'estensione di file può essere ok, ma non è incredibilmente affidabile poiché è così facilmente cambiata.

Ho ottenuto ottimi risultati usando una funzione utente di http://php.net/manual/de/function.mime-content -type.php @ '' john dot howard at prismmg dot com 26-ott-2009 03:43 ''

function get_mime_type($filename, $mimePath = '../etc') { ...

che non utilizza finfo, exec o la funzione obsoleta

funziona bene anche con risorse remote!

se hai a che fare solo con le immagini puoi usare la funzione [getimagesize ()] [1] che contiene tutti i tipi di informazioni sull'immagine, incluso il tipo.

Un approccio più generale sarebbe quello di utilizzare l'estensione FileInfo da PECL. La documentazione di PHP per questa estensione è disponibile all'indirizzo: http: //us.php .net / manuale / it / ref.fileinfo.php

Alcune persone hanno seri reclami su quell'estensione ... quindi se riscontri problemi seri o non riesci a installare l'estensione per qualche motivo potresti voler controllare la funzione deprecata mime_content_type ()

Se usi Linux e hai l'estensione, puoi semplicemente leggere il tipo MIME da /etc/mime.types creando un array hash. È quindi possibile archiviarlo in memoria e chiamare semplicemente il MIME con il tasto array :)

/**
 * Helper function to extract all mime types from the default Linux /etc/mime.types
 */
function get_mime_types() {
    $mime_types = array();
    if (
        file_exists('/etc/mime.types') &&
        ($fh = fopen('/etc/mime.types', 'r')) !== false
    ) {
        while (($line = fgets($fh)) !== false) {
            if (!trim($line) || substr($line, 0, 1) === '#') continue;
            $mime_type = preg_split('/\t+/', rtrim($line));
            if (
                is_array($mime_type) &&
                isset($mime_type[0]) && $mime_type[0] &&
                isset($mime_type[1]) && $mime_type[1]
            ) {
                foreach (explode(' ', $mime_type[1]) as $ext) {
                    $mime_types[$ext] = $mime_type[0];
                }
            }
        }
        fclose($fh);
    }
    return $mime_types;
}

Il mime di qualsiasi file sul tuo server può essere ottenuto con questo

<?php
function get_mime($file_path){
  $finfo = new finfo(FILEINFO_MIME_TYPE);
  $type  = $finfo->file(file_path);
}

$mime = get_mime('path/to/file.ext');
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top