Frage

Ich habe eine "dilema" und frage mich, was Unternehmen Best Practice ist.

Ich verwende Uploadify Bilder zu. Jetzt muß ich die Dateinamen überprüfen, bevor die Datei zu speichern.

Ich habe an verschiedenen Lösungen gesucht, kann aber auf eine gute Lösung nicht unterkriegen.

Hier sind meine Kriterien:

  • Dateiname müssen alle in Klein
  • sein
  • Dateiname kann nur enthalten Charaters [a-z0-9 _-]
  • Ich muss in der Lage sein, Datei umbenennen

Wie würden Sie gehen über, wenn ein Dateiname ist my.file(name).jpeg?

Ich kann den Dateinamen auf explodieren ‚‘ und die Erweiterung speichert, dann implodieren die Dateinamen wieder zu bekommen. Aber nicht sicher, ob das die beste soltion.

Ich habe die folgenden Funktionen, die ein wenig hilft:

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
Ich recieving die Datei über $ _FILES. Das gibt mir die folgenden Daten:

  • $ _ FILES [ "file"] [ "name"] - der Name der hochgeladenen Datei
  • $ _ FILES [ "file"] [ "type"] - der Typ der hochgeladenen Datei
  • $ _ FILES [ "file"] [ "Größe"] - die Größe in Bytes der hochgeladenen Datei
  • $ _ FILES [ "file"] [ "tmp_name"] - der Name der temporären Kopie der Datei auf dem Server gespeichert
  • $ _ FILES [ "file"] [ "error"] - der Fehlercode aus dem Datei-Upload resultierenden

UPDATE 2
Ich habe gerade etwas. Ich konnte verwenden getimagesize die eine Anordnung von Elementen 7 zurück. Eines dieser Elemente [2] ist IMAGETYPE_XXX.

Also ich versuche, mit diesem Code:

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

Aber es liefert nur die Nummer 2 ...

(Ich habe auch versucht exif_imagetype verwenden, aber es nur bekommen PHP-Fehler:. Call to undefined function )

War es hilfreich?

Lösung

Überprüfen Sie Dateinamen mit regex. Verwenden Sie Informationen über MIME-Typ. Speichern Sie die Datei auf dem Server mit md5 Namen. Bewahren reale Dateinamen auf db.

Andere Tipps

pathinfo () können Sie den Dateinamen und Erweiterung erhalten. Ich werde Sie warnen, dass Sie nicht auf die Prüfung einer Datei Erweiterung durch Inspektion seiner Dateinamen verlassen können, jedoch. Sie wollen eine Funktion verwenden, die tatsächlich den binären Inhalt einer Datei für diese inspiziert. finfo_file () kann dies erreichen. Oh, und es schadet nie, Basisnamen () auf einem vom Benutzer angegebenen Dateipfad verwenden, um einen Weg zu verhindern, Traversal Angriff.

Ich gehe davon aus Sie Dateinamen für die spätere Verwendung als Download Dateinamen validieren.

Während es wäre toll, Dateinamen zu erhalten, wie sie im Interesse des Benutzers ist, aus technischen Sicht, Ihr Ansatz klingt Sound.

Wenn Sie interessieren, was die URLs aussehen, und kann ein internationales Publikum in die Zukunft zielen, sollten Sie Umlaute in ihre Basis Zeichen entweder zu konvertieren oder sie zu konvertieren. Ein Deutsch Benutzer (Umlaute Ä Ö Ü ß) erwarten würde Umwandlung:

Ä = ae
Ö = oe
Ü = ue

, während die Skandinavier scheinen wohl zu sein mit

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

und so weiter.

Dann gibt es die verschiedenen akzentuierte Zeichen é á ó ...

Dropping führt jene ganz zu URLs, die aussehen wirklich bd und lok strng in der bwsr Adresse br.

Dies sollte alles tun, Sie wollen:

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

Und wie Pekka erklärt es, wenn Sie alle Akzentuierung im Dateinamen ersetzen möchten Sie die folgende Funktion verwenden können:

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

Ich glaube nicht, sollten Sie „bestätigen“ der Dateiname, sollten Sie nur „reparieren“ es, wenn es nicht in dem Format ist, dass Sie mögen. Warum lehnen eine Datei nur weil jemand ihre Dateien bei der Benennung saugt, oder hat einige ungewöhnliche Zeichen da drin? Auch, wenn Sie mit Bildern arbeiten, können Sie verwenden getimagesize wie Sie bereits erwähnt, um sicherzustellen, dass es tatsächlich ein Bild ist, die hochgeladen wurde (sollte fehlschlagen, wenn es kein Bild ist).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top