Pergunta

Eu tenho um "dilema" e me pergunto o que é as melhores práticas de negócios.

Estou usando o upload para fazer upload de imagens. Agora preciso validar o nome do arquivo antes de salvar o arquivo.

Eu olhei para soluções diferentes, mas não consigo chegar a uma boa solução.

Aqui estão meus critérios:

  • O nome do arquivo deve estar todo em minúsculas
  • O nome do arquivo só pode conter charaters [a-z0-9_-
  • Devo ser capaz de renomear o arquivo

Como você seria se um nome de arquivo for my.file(name).jpeg ?

Eu poderia explodir o nome do arquivo em ''. e salve a extensão, depois implode para obter o nome do arquivo novamente. Mas não tenho certeza se essa é a melhor solção.

Eu tenho as seguintes funções que ajudam um pouco:

function getExts($filename) 
{ 
    $exts = explode("[/\\.]", $filename) ; 
    $n = count($exts)-1; 
    $exts = $exts[$n]; 
    return $exts; 
}

function validFilename($filename)
{
    $filename = str_replace(" ", "_", $filename);
    $pattern = "/[^[a-z0-9_-]/";
    return preg_replace($pattern, "", strtolower($filename));
} 

Atualização 1
Estou recebendo o arquivo através de $ _files. Isso me dá os seguintes dados:

  • $ _Files ["arquivo"] ["nome"] - o nome do arquivo carregado
  • $ _Files ["arquivo"] ["tipo"] - o tipo do arquivo carregado
  • $ _Files ["arquivo"] ["tamanho"] - o tamanho em bytes do arquivo carregado
  • $ _Files ["arquivo"] ["tmp_name"] - o nome da cópia temporária do arquivo armazenado no servidor
  • $ _Files ["arquivo"] ["erro"] - o código de erro resultante do upload do arquivo

Atualização 2
Acabei de encontrar algo. eu poderia usar getImagesize que retornará uma matriz de 7 elementos. Um desses elementos [2] é ImageType_XXX.

Então, eu tento usar este código:

function getExts2($filename)
{
    list(,,$type) = getimagesize($filename);
    return $type;
}

Mas só retorna o número 2 ...

(Eu também tentei usar exif_imageType, mas só fica Erro do PHP: Chamada para função indefinida.)

Foi útil?

Solução

Verifique o nome do arquivo com regexp. Use informações sobre o Mimetype. Salvar o arquivo no servidor com o nome do MD5. Armazene o nome do arquivo real no banco de dados.

Outras dicas

pathinfo () pode obter o nome do arquivo e a extensão. No entanto, avisarei que você não pode confiar em testar a extensão de um arquivo através da inspeção de seu nome de arquivo, no entanto. Você deseja usar uma função que realmente inspecione o conteúdo binário de um arquivo para isso. finfo_file () pode conseguir isso. Ah, e nunca é demais usar nome de base () em um caminho de arquivo fornecido pelo usuário para evitar um ataque de travessia de caminho.

Suponho que você esteja validando nomes de arquivos para uso posterior como nomes de arquivos de download.

Embora seja ótimo preservar os nomes de arquivos, como são por causa do usuário, do ponto de vista técnico, sua abordagem parece soar.

Se você se preocupa com a aparência dos URLs e pode atingir um público internacional no futuro, certifique -se de converter umlauts em seus personagens base ou convertê -los. Um usuário alemão (umlauts ä Ö ü ß) esperaria conversão:

Ä = ae
Ö = oe
Ü = ue

Enquanto os escandinavos parecem estar à vontade com

Ä => a
Ö => o
Ø => o

e assim por diante.

Depois, há os vários personagens acentuados é Ó ...

A retirada daqueles leva a URLs que parecem verdade BD e Lok strng no endereço BWSR BR.

Isso deve fazer tudo o que você deseja:

$filename = preg_replace('/[^[a-z0-9_-]/', '', str_replace(' ', '_', strtolower(pathinfo($filename, PATHINFO_FILENAME)))) . pathinfo($filename, PATHINFO_EXTENSION);

E como Pekka explicou, se você deseja substituir toda a acentuação no nome do arquivo, poderá usar a seguinte função:

function Unaccent($string)
{
    return preg_replace('~&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', htmlentities($string, ENT_QUOTES, 'UTF-8'));
}

Eu não acho que você deva "validar" o nome do arquivo, você deve apenas "consertar" se não estiver no formato que deseja. Por que rejeitar um arquivo apenas porque alguém é péssimo em nomear seus arquivos ou tem alguns caracteres incomuns lá? Além disso, se você está trabalhando com imagens, pode usar getimagesize Como você mencionou para garantir que ele seja uma imagem que foi carregada (deve falhar se não for uma imagem).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top