Pergunta

Ok, então eu tenho um arquivo index.php que tem de processar muitos tipos de arquivos diferentes. como é que eu acho que o tipo de arquivo baseado no REQUEST_URI.

Se eu solicitar http://site/image.jpg, e todos os pedidos redirecionar através de index.php, que tem esta aparência

<?php
   include('/www/site'.$_SERVER['REQUEST_URI']);
?>

Como eu poderia fazer esse trabalho corretamente?

Devo teste com base na extensão do arquivo solicitado, ou há uma maneira de obter o tipo de arquivo?

Foi útil?

Solução

Se você tem certeza que você está sempre apenas trabalhar com imagens, você pode conferir o rel getimagesize () exif_imagetype () função PHP, que as tentativas para voltar a imagem do tipo MIME.

Se você não se importa dependências externas, você pode também verificar o excelente getID3 biblioteca que pode determinar a mime-type de muitos tipos diferentes de arquivo.

Por fim, você pode conferir o mime_content_type () função - mas foi preterido para a Fileinfo extensão PECL.

Outras dicas

mime_content_type () está obsoleto, então você não será capaz de contar com ele a trabalhar no futuro. Há um "fileinfo" extensão PECL, mas eu não ouvi coisas boas sobre ele.

Se você estiver executando em um servidor * nix, você pode fazer o seguinte, que tem funcionado muito bem para mim:

$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;
  }
}

Para mim, nada disso funciona -. mime_content_type está obsoleta, finfo não está instalado, e shell_exec não é permitido

Na verdade, eu cansei pela falta de padrão MIME sniffing métodos em PHP. Instale fileinfo ... Use funções obsoleto ... Oh esses trabalhos, mas apenas para imagens! Eu cansei dele, então eu fiz alguma pesquisa e encontrou o WHATWG Mimesniffing especificação - Eu acredito que este é ainda um projecto de especificação embora.

De qualquer forma, usando esta especificação, eu era capaz de implementar um mimesniffer em PHP. O desempenho não é um problema. Na verdade na minha máquina humilde, eu era capaz de abrir e cheirar milhares de arquivos antes de PHP expirou.

Aqui é a classe MimeReader .

require_once("MimeReader.php");

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

Se você está trabalhando com apenas imagens e você precisa tipo mime (por exemplo, para cabeçalhos), então esta é a resposta mais rápida e direta:

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

Será saída verdadeiro tipo de imagem mime mesmo se você mudar o nome do arquivo de imagem

De acordo com o manual do php, o finfo-file função é melhor maneira de fazer isso. No entanto, você precisará instalar a extensão FileInfo PECL.

Se a extensão não é uma opção, você pode usar o mime_content_type função desatualizado.

mime_content_type() parece ser o caminho a percorrer, não obstante os comentários acima dizendo que é obsoleto. Não é - ou pelo menos esta encarnação de mime_content_type() não está obsoleta, de acordo com http://php.net/manual/en/function.mime-content-type.php . É parte da extensão FileInfo, mas a documentação PHP agora nos diz que é ativado por padrão a partir do PHP 5.3.0.

Você pode usar finfo para alcançar este objetivo a partir do PHP 5.3:

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

A bandeira FILEINFO_MIME_TYPE é opcional; sem ele você obter um mais detalhado corda para alguns arquivos; (Aparentemente alguns tipos de imagem retornará tamanho e profundidade de cor de informações). Usando a bandeira FILEINFO_MIME retorna o tipo MIME e que codifica se disponível (por exemplo, imagem / jpeg; charset = binário ou text / x-php; charset = US-ASCII). Consulte neste site para mais informações.

Eu não tê-lo usado, mas há um PECL extensão para obter mimetype de um arquivo . A documentação oficial para ele está em manual.

Dependendo de seus propósitos, uma extensão de arquivo pode ser ok, mas não é incrivelmente confiável, já que ele é tão facilmente alterado.

i ficou muito bons resultados utilizando uma função de usuário de http://php.net/manual/de/function.mime-content -type.php @ '' John dot howard em prismmg dot com 26-Oct-2009 03:43 ''

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

que uso does not finfo, função exec ou obsoleto

funciona bem também com ressources remotos!

Se você está lidando apenas com as imagens que você pode usar a função [getimagesize()][1] que contém todos os tipos de informação sobre a imagem, incluindo o tipo.

Uma abordagem mais geral seria usar a extensão FileInfo do PECL. A documentação PHP para esta extensão pode ser encontrada em: http: //us.php .net / manual / en / ref.fileinfo.php

Algumas pessoas têm sérias queixas sobre essa extensão ... então, se você tiver problemas graves ou não pode instalar a extensão, por algum motivo que você pode querer verificar para fora a função deprecated mime_content_type()

Se você executar Linux e têm a extensão que você poderia simplesmente ler o tipo MIME de /etc/mime.types fazendo uma matriz hash. Você pode então armazenar que na memória e simplesmente chamar o MIME pela chave 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;
}

O mime de qualquer arquivo no seu servidor pode ser obtido com este

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

$mime = get_mime('path/to/file.ext');
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top