Domanda

Ho un "dilemma" e mi chiedo che cosa è meglio pratica commerciale.

sto usando Uploadify per caricare le immagini. Ora ho bisogno di convalidare il nome del file prima di salvare il file.

Ho guardato diverse soluzioni, ma non riesco a scendere a una buona soluzione.

Qui sono i miei criteri:

  • Nome file deve essere tutto in minuscolo
  • Nome file può contenere solo charaters [a-z0-9 _-]
  • devo essere in grado di rinominare file

Come si va su se il nome del file è my.file(name).jpeg?

ho potuto esplodere il nome del file '' e salvare l'estensione, poi implodere per ottenere di nuovo il nome del file. Ma non so se questo è il meglio soltion.

Ho le seguenti funzioni che aiuta un po ':

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

UPDATE 1
Sto ricezione del file tramite $ _FILES. Questo mi dà i seguenti dati:

  • $ _ FILES [ "file"] [ "nome"] - il nome del file caricato
  • $ _ FILES [ "file"] [ "tipo"] - il tipo di file caricato
  • $ _ FILES [ "file"] [ "dimensione"] - la dimensione in byte del file caricato
  • $ _ FILES [ "file"] [ "tmp_name"] - il nome della copia temporanea del file memorizzato sul server
  • $ _ FILES [ "file"] [ "errore"] - il codice di errore risultante dal caricamento di file

UPDATE 2
Ho appena trovato qualcosa. Ho potuto utilizzare GetImageSize che restituirà un array di 7 elementi. Uno di questi elementi [2] è IMAGETYPE_XXX.

Quindi cerco utilizzando questo codice:

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

Ma restituisce solo il numero 2 ...

(ho anche provato ad utilizzare exif_imagetype, ma ottenere solo PHP Errore:. Invocami undefined function )

È stato utile?

Soluzione

Controllare il nome del file con espressioni regolari. Utilizzare informazioni sul tipo MIME. Salvare file sul server con nome MD5. Conservare vero nome di file sui db.

Altri suggerimenti

pathinfo () si può ottenere il nome del file e l'estensione. Ti avverto che non si può contare sul test estensione di un file mediante l'ispezione del suo nome, però. Si vuole utilizzare una funzione che ispeziona in realtà il contenuto binario di un file per questo. finfo_file () può raggiungere questo obiettivo. Oh, e non fa mai male a utilizzare basename () su un percorso di file fornito dall'utente per evitare un percorso attacco attraversamento.

Io parto dal presupposto che si sta convalidando i nomi dei file per un uso successivo, come i nomi dei file di download.

Anche se sarebbe bello per conservare i nomi di file come lo sono per il bene degli utenti, dal punto di vista tecnico, il vostro approccio suoni suono.

Se avete a cuore quello che gli URL assomigliano, e può indirizzare un pubblico internazionale, in futuro, essere sicuri di convertirsi dieresi ai loro personaggi di base o di convertirli. Un utente tedesco (dieresi Ä Ö Ü ß) si aspetta di conversione:

Ä = ae
Ö = oe
Ü = ue

, mentre gli scandinavi sembrano essere a proprio agio con

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

e così via.

Poi ci sono i vari caratteri accentati e a ó ...

La caduta quei cavi del tutto agli URL che cercare davvero bd e strng lok nell'indirizzo br bwsr.

Questo dovrebbe fare tutto quello che vuoi:

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

E come Pekka spiegato, se si desidera sostituire tutte accentuazione nel nome del file è possibile utilizzare la seguente funzione:

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'));
}

Non credo che si dovrebbe "validare" il nome del file, si deve solo "fissare", se non è nel formato che si desidera. Perché rifiutare un file solo perché qualcuno fa schifo a nominare i propri file, o ha alcuni caratteri insoliti in là? Inoltre, se si sta lavorando con le immagini, è possibile utilizzare getimagesize come lei ha ricordato per assicurarsi che in realtà è l'immagine che è stato caricato (dovrebbe fallire se non è un'immagine).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top