PHP File upload

k3nguruh

Erfahrenes Mitglied
Hallo,

irgendwie stehe ich auf dem Schlauch.

Ich habe ein Formular mit einigen Eingabefeldern und halt ein File-Upload Feld.

Wenn bei dem Abschicken von dem Formular ein Fehler auftritt, zum Bsp. fehlt der Nachname, leitet meine Fehlerroutine zu dem Formular wieder zurück und trägt alle Values in die entsprechenden Felder wieder ein.
Soweit so gut....

Aber, wie muss ich vorgehen, damit der Benutzer nicht nochmal das Upload-File aussuchen muss?


Über jede Hilfe wäre ich dankbar.
 
Hallo,

mmhh..., wäre sicher eine Möglichkeit.
Aber wie werde ich die Datei(en) wieder los, wenn der Benutzer diese dann doch nicht nochmal hochladen will. Dann bleibt die ja im Ordner liegen. Ich habe jetzt noch nicht viel weiter überlegt, aber irgendwie beim nächsten Upload prüfen, ob Dateien älter als xx Stunden bzw. Tage sind und dann alle löschen....

Oder wie würdest du das machen?
 
Hi
Ich würde das Formular vor dem Absenden per Javascript überprüfen ob alle Eingaben richtig erledigt wurden und es erst dann absenden. Somit kannst du dir das zwischenspeichern am Server auch sparen.

Lg hendl
 
Gute Idee mit dem JS, aber nicht vergessen, auch am Server zu validieren. Wenn ich mein JS im Browser deaktiere, umgehe ich so den Schutz. Den auf dem Server kann ich aber nicht umgehen.

Wenn jemand JS dann im Browser deaktiviert, ist es sein Problem, wenn er/sie die Datei noch mal wählen muss. Und das ist ja nun wirklich nicht so tragisch.
 
Wenn jemand JS dann im Browser deaktiviert, ist es sein Problem, wenn er/sie die Datei noch mal wählen muss. Und das ist ja nun wirklich nicht so tragisch.
Da muss ich widersprechen.
Heutzutage deaktivieren zwar nur mehr oder weniger versierte Leute JS, aber denen dann nochmal zuzumuten, die Datei hochzuladen finde ich nicht in Ordnung.

Erstmal brauchst du eine Tabelle in der DB, die Uploads speichert (bzw. deren Dateisystempfade). Hast du solch eine bereits? Dann füge eine Spalte namens "confirmed" o.Ä. hinzu.
Nun, wenn der Nutzer das Formular (mit deaktiviertem JS) abschickt, dann wird in der Tabelle ein Datensatz gespeichert, allerdings mit "confirmed=0" (=false). Jetzt gibst du das Formular in deinem Skript wieder aus, allerdings musst du die ID des eben erstellten Datensatzes übertragen, sodass dein Skript später die Formulareingaben und die bereits gespeicherte Datei in Zusammenhang bringen kann.

Regelmäßig lässt du auch ein Skript laufen (Cronjob), welches nach Datensätzen Ausschau hält, bei denen "confirmed=0" ist und deren Erstelldatum x Minuten oder Stunden zurückliegt.
 
Mist, das nächste mal sollte ich dazu schreiben, dass ich das als Ironie meint habe ;-)

EDIT: Natürlich ist eine Validierung browser-seitig schon mal ok, aber man sollte sich auf keinen Fall darauf verlassen. Mehr wollte ich nicht rüberbringen. Der untere Teil ist komplette Ironie.
 
Hallo,

Javascript muss wegen jQuery auf meiner Seite aktiviert sein... Ansonsten kann man gar keine Datei auswählen. Habe aber jetzt auch keine JS überprüfung eingebaut, alles passiert auf dem Server.

Falls es einen Interessiert:

(Anmerkung: der Klick auf den Button wird mit jQuery auf das normale Input-File geleitet)
HTML:
<div>
  <input style="width: 232px;" type="text" id="file" name="file" value="{$value_file}" />
  <button class="inline" style="width: 60px;" type="button" id="upload" name="upload">Datei</button>
  <input style="display: none;" type="file" id="ufile"  name="ufile" />
</div>

die Fehlerroutine:
PHP:
    if (isset($_POST['file']) && $_POST['file'])
    {
        $file = array();
        $file['name'] = $_FILES['ufile']['name'];
        $file['type'] = $_FILES['ufile']['type'];
        $file['tmp_name'] = $_FILES['ufile']['tmp_name'];
        $file['error'] = $_FILES['ufile']['error'];
        $file['size'] = $_FILES['ufile']['size'];
        $file['file'] = $config['dir_upload_temp'] . "/" . $_POST['file'];

        if ($file['tmp_name'] != "")
        {
            move_uploaded_file($file['tmp_name'], $file['file']);
        }
        else
        {
            if (file_exists($file['file']))
            {
                $file['type'] = mime_content_type( $file['file'] );
                $file['size'] = filesize( $file['file'] );
                $file['error'] = 0;
            }
        }

        if (!$error && $file['error'] != 0)
        {
            $error['error'][] = MSG_UPLOAD_CRITICAL;
            $error['field']['file'] = " error=\"true\"";
        }

        # pdf, doc, docx, xls und xlsx
        if (!$error &&
            $file['type'] != "application/pdf" &&
            $file['type'] != "application/x-pdf" &&
            $file['type'] != "application/msword" &&
            $file['type'] != "application/vnd.openxmlformats-officedocument.wordprocessingml.document" &&
            $file['type'] != "application/vnd.ms-excel" &&
            $file['type'] != "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
        {
            $error['error'][] = MSG_DATEIFORMAT_UNGUELTIG;
            $error['field']['file'] = " error=\"true\"";
        }

        if (!$error && $file['size'] > 250000)
        {
            $error['error'][] = MSG_DATEIGROESSE_UNGUELTIG;
            $error['field']['file'] = " error=\"true\"";
        }
    }

und wenn dann keine Fehler aufgetreten sind:
PHP:
    // hängt NUR das an, was in $_POST nicht drin ist
    $output = ($_POST + $output);

    if ($output['file'] && file_exists($config['dir_upload_temp'] . "/" . $output['file']))
    {
        $filename = strtolower(makeRandomCode(15) . "." . pathinfo($output['file'], PATHINFO_EXTENSION));
        rename($config['dir_upload_temp'] . "/" . $output['file'], $config['dir_upload_ausbildung'] . "/" . $filename);
        $output['file'] = $filename;
    }

Ich habe das jetzt mal aus meinen Code rausgegriffen ohne es noch für hier speziel anzupassen. Daher sind einige eigene Functionen mit in dem Code.....
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück