2009-04-15 11 views
18

Können Sie ein Bild in einer PHP SESSION speichern?PHP - Bilder in SESSION Daten speichern?

Ich habe einen mehrstufigen Registrierungsprozess mit PHP auf meiner Website. Auf einem der Schritte können die Benutzer ihr Firmenlogo (Bild) hochladen.

Der letzte Schritt ist die Verarbeitung ihrer Kreditkarte.

Bevor ich irgendwelche Bilder auf den Webserver und den Bildstandort in die Datenbank schreibe, möchte ich sicherstellen, dass ihre Kreditkarte gültig ist und verarbeitet wird.

So ist es möglich, diese Bilddaten in der Variable SESSION zwischenzuspeichern?

Wenn nicht, wie sonst speichern Personen temporär Bilddaten in Formularen, bevor sie diese Daten übergeben?

Antwort

29

Sie können aber erwarten, dass die Speichernutzung Ihrer Sitzung abhängig von der Größe der Bilder zunimmt. Dazu müssen Sie den Inhalt der Datei in einer Sitzungsvariablen speichern.

Wenn es sich um Sitzungsdaten handelt und Sie mehrere Schritte nach dem Hochladen haben, wird das Bild (in die Sitzung) neu geladen, bis die Schritte abgeschlossen sind.

Ich würde persönlich empfehlen, die Sitzung für das Halten einer Binärdatei zu verwenden. Speichern Sie das Image auf einem Datenträger an einem temporären Speicherort, bis die Registrierung abgeschlossen ist. Ich würde nur den Pfad zur temporären Datei in der Sitzung speichern. Wenn die Transaktion abgeschlossen ist, verschiebe sie an einen richtigen Ort und führe deine db ein.

Sitzungsdaten werden im Wesentlichen sowieso auf der Festplatte (oder db) gespeichert, so dass Sie die Image-Datei speichern und dann einen Befehl zum Verschieben ausgeben können.

+2

Was passiert, wenn die Registrierung fehlschlägt? Woher weißt du, welches Bild gelöscht werden soll, da es sich um ein Bild handelt, das mit einer anderen PHP-Instanz verknüpft ist? – Burimi

0

Ja, Sie können ein Bild in einer PHP-Sitzung speichern. Holen Sie es in PHP als Zeichenfolge (d. H. Binärdaten) und dann können Sie es in die Sitzung einfügen.

Sie möchten, dass es nur so groß ist, wie es sein muss, und Sie müssen es löschen, sobald Sie es nicht brauchen, da große Informationen in der Sitzung den Sitzungsstart verlangsamen.

3

Wenn eine Datei hochgeladen wird, wird ihr im Array $ _FILES ein temporärer Name zugewiesen. Ich kenne die genaue Lebensdauer dieser Dateien nicht, aber Sie können diesen Namen möglicherweise in der Sitzung erfassen und den Aufruf move_uploaded_file() aufschieben, bis das CC überprüft wurde.

Oder Sie könnten den CC Schritt zuerst tun.

+0

Alle Dateien im Array $ _FILES werden entfernt, wenn die Ausführung des PHP-Skripts beendet wird, d. H. Alle hochgeladenen Dateien gehen verloren, wenn Sie sie nicht an einen anderen Ort verschoben haben. – Serg

9

Ich würde die Datei auf der Festplatte speichern, Sie könnten es sogar mit der Sitzungs-ID des Benutzers benennen. Dann könnte es ein Aufräum-Skript geben, das als Cron-Job ausgeführt wird und die Bilder von Leuten löscht, die niemals erfolgreich bezahlt haben.

Wenn Sie versuchen, ein Bild in der Sitzung zu speichern, machen Sie es falsch.

1

Manchmal müssen wir die Seite in der Vorschau anzeigen/bestätigen, bevor Daten in die Datenbank gespeichert werden. Aber Image-Datei auf die Bestätigungsseite ist ein bisschen anders.Sie können nicht $_SESSION['s_name'] = $_FILES['f_name'] coz SESSION einfach die Textdatei. In alternativer Weise halten Dateiinhalt/Binärwert in der Sitzung.

1

Wenn Sie die Daten behalten müssen, würde ich vorschlagen, es als base64_encoded Zeichenfolge zu halten.Sie können base64_encode-Bilddaten direkt an den Browser senden.

Wenn ich in einer ähnlichen Situation wäre, hätte ich lieber das Bild gespeichert und die Informationen über das Bild in der Sitzung/db gespeichert. Wenn aus irgendeinem Grund die Registrierung fehlschlägt, würde ich die Datei später wieder aufheben. und gelegentlich Cron-Jobs ausführen, um fehlende Links zu den Bildern zu finden.

Aber ich werde Ihnen wirklich empfehlen, bei der zweiten Option zu bleiben und den Ärger ganz zu vermeiden.

0

Sie können Bilddaten in der Sitzung als Basis einfach codieren. Auf dem Produktionsserver sollte genügend RAM vorhanden sein. Meine Anwendung benötigte bis zu 40 MB 4 Bilder/Apps zum Aktualisieren und Ändern, bevor Sie mongoDB einlegten. (Basis-Codierung macht das 1,3-fache größere Bildgröße.)

$tmpNameSS1 = $_FILES["screenshot1"]["tmp_name"]; 
    $fp  = fopen($tmpNameSS1, 'r'); 
    $rawDataSS1 = fread($fp, filesize($tmpNameSS1)); 
    fclose($fp); 
    $SS1FileName = $_FILES["screenshot1"]["name"]; 
    $encodedSS1Data = base64_encode($rawDataSS1); 

    registry::update('sCreateSS1Name', $SS1FileName); 
    registry::update('sCreateSS1Data', $encodedSS1Data); 

Ein Fall sein wird: Sie mehrere Bild müssen hochgeladen und sowohl Client- als auch Server-Validierung für Größe und Typ. Es ist schneller aus der Sitzung abzurufen. Nach dem Einfügen in DB Null die Variable, die das Bild enthält.

Browser wird zeigen zeigen, das Bild mit:

<img src="data:image/;base64,<?php echo registry::get('sCreateSS1Data'); ?>"/> 

Sie die Sitzung für das Bild mit leeren String aktualisieren können, nachdem der Code das Ende des Blocks erreicht. Ein typischer Fall ist das Aktualisieren des Formularfelds mit Validierung und wenn der Benutzer den Text ändern möchte. Sie möchten auch anzeigen, welches Bild zwischen diesen fehlgeschlagenen Updates hochgeladen wurde. Wenn Sie den Hin- und Rückflug speichern möchten (ratsam), bewahren Sie die Daten für einige Momente in der Sitzung auf und leeren Sie diesen Wert, nachdem der Code beendet wurde.