Torsten: Bild hochladen oder doch nicht

Hi,

ich habe folgendes Problem:
Ich gebe den Anwendern eines Formulares die Möglichkeit einen Text einzugeben und ein Bild hochzuladen (1.Schritt).
Nach dem Absenden soll der Text mit dem Bild zur Kontrolle angezeigt werden (2. Schritt), bevor der Text in der Datenbank und das Bild auf den Server gespeichert werden (3. Schritt).

Ist es möglich das man sich das Bild im 2. Schritt zur Kontrolle anzeigen lassen kann ohne es auf den Server gespiechert zu haben. Es könnte der Fall auftreten, dass der Anwender lieber ein anderes Bild verwenden möchte.

Oder kann man ein vorher hochgeladenes Bild mit einem anderen auf dem Server überschreiben bzw. ersetzen ?

  1. Lieber Torsten,

    prinzipiell gilt:
    Hochgeladene Dateien werden in einem temporären Verzeichnis unter einem temporären Namen gespeichert, aus dem sie spätestens nach Beendigung des Scripts wieder gelöscht werden.

    Das bedeutet:
    Hochgeladene Dateien müssen aus dem temporären Verzeichnis verschoben und umbenannt werden (passende Daten stehen im $_FILES-Array), damit sie nicht verloren gehen.

    Nach dem Absenden soll der Text mit dem Bild zur Kontrolle angezeigt werden (2. Schritt)

    Dazu musst Du das Bild bereits unter seinem Namen in einem passenden Verzeichnis speichern (am besten zusammen mit dem Text), damit nicht PHP automatisch dieses Bild (und am besten auch den Text) wieder löscht.

    bevor der Text in der Datenbank und das Bild auf den Server gespeichert werden (3. Schritt).

    Du kannst ja einen Dateinamen von Deinem Script her festlegen, der mit dem Text irgendwie in Verbindung steht, sodass das Bild nur diesen einen möglichen Dateinamen haben kann. Dadurch würde das erneute Hochladen eines anderen Bildes ein Überschreiben des ersteren bedeuten.

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
  2. Hello,

    ein solcher Vorgang ist ein klassisches Beispiel für eine Session.

    Client: Der User lädt etwas
    Server: auf den Server.
            Ein Auszug daraus
    Client: wird ihm zur Kontrolle nochmals angezeigt.
            Wenn alle Angaben OK sind,
    Server: sollen sie auf dem Server verarbeitet werden und
    Client: auf dem Client eine Quittung ausgegeben werden

    Um die Datenmenge beim Ping-Pong-Spiel zwischen Client und Server zu minimieren werden alle bereits hochgeldandenen Daten auf dem Server gespeichert, typischerweise in einer Sessiondatei.
    Außerdem kann sich der Server in dieser Sessiondatei seine eigenen Vermerke füe den Vorgang machen, also Variablen speichern, die den Client überhaupt nix angehen.

    Wenn Dein Bild nicht zu groß wird, kannst Du es also auch in der Sessiondatei abspeichern.

    Dazu legst Du im Session-Array einfach eine Variable an:

    if (isset($_FILES[$fieldname]['error'] and $_FILES[$fieldname]['error']===0))
    {
       $_SESSION[$fieldname]['content'] = file_get_contents($_FILES[$fieldname]['temp_name']);
       $_SESSION[$fieldname]['name']    = basename($_FILES[$fieldname]['name']);
       $_SESSION[$fieldname]['realmimetype'] = mime_content_type($_FILES[$fieldname]['temp_name']);
    }

    Nun sind der Inhalt der Uploaddatei und der lokale Name der Uploaddatei vom Client in der Session gespeichert.

    Du kannst nun z.B. ein Thumbnail daraus machen und dieses dann in einem speziellen, durch http erreichbaren Verzeichnis unter einem zufälligen Dateinamen ablegen und diesen Namen dann als src="meinthumbname.jpg" in die response einbauen oder Du produzierst aus der Session ein 'Thumbnail on the fly'. Dazu benötigst Du eine Funktion, die auf

    <image src="meinbild.php" alt="Vorschaubild" />

    eben mittels der Ressource meinbild.php in der aktuellen Session schaut, ob unter

    $_SESSION[$fieldname]['content']

    ein sinniger Eintrag besteht, und dieser ein Bild ist
    http://www.php.net/manual/de/function.imagecreatefromstring.php

    Nach dem Resizen mit
    http://www.php.net/manual/de/function.imagecopyresized.php

    oder Resamplen mit
    http://www.php.net/manual/de/function.imagecopyresampled.php

    kannst Du es dann mit
    [http://www.php.net/manual/de/function.imagejpeg.php]

    wieder an den Client ausgeben.
    Vergiss nicht, den JPG-Content-Header davor zu setzen.

    Alternativ kann man bei größeren Bildern auch eine temporäre Bilddatei im Session-Verszeichnis ablegen. Das ist nicht ganz einfach, weil man einen gültigen Sessionnamen erzeugen muss, ohne wirklich eine Session zu starten für das Bild. Aber es funktioniert prima und abgelaufene Bilder werden so genauso wieder aufgeräumt nach einiger Zeit, wie abgelaufene Sessions.

    Liebe Grüße aus Syburg bei Dortmund

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Hello,

      Hello,

      ein solcher Vorgang ist ein klassisches Beispiel für eine Session.

      Client: Der User lädt etwas
      Server: auf den Server.
              Ein Auszug daraus
      Client: wird ihm zur Kontrolle nochmals angezeigt.
              Wenn alle Angaben OK sind,
      Server: sollen sie auf dem Server verarbeitet werden und
      Client: auf dem Client eine Quittung ausgegeben werden

      Um die Datenmenge beim Ping-Pong-Spiel zwischen Client und Server zu minimieren werden alle bereits hochgeldandenen Daten auf dem Server gespeichert, typischerweise in einer Sessiondatei.
      Außerdem kann sich der Server in dieser Sessiondatei seine eigenen Vermerke füe den Vorgang machen, also Variablen speichern, die den Client überhaupt nix angehen.

      Wenn Dein Bild nicht zu groß wird, kannst Du es also auch in der Sessiondatei abspeichern.

      Dazu legst Du im Session-Array einfach eine Variable an:

      if (isset($_FILES[$fieldname]['error'] and $_FILES[$fieldname]['error']===0))
      {
         $_SESSION[$fieldname]['content'] = file_get_contents($_FILES[$fieldname]['temp_name']);
         $_SESSION[$fieldname]['name']    = basename($_FILES[$fieldname]['name']);
         $_SESSION[$fieldname]['realmimetype'] = mime_content_type($_FILES[$fieldname]['temp_name']);
      }

      Nun sind der Inhalt der Uploaddatei und der lokale Name der Uploaddatei vom Client in der Session gespeichert.

      Du kannst nun z.B. ein Thumbnail daraus machen und dieses dann in einem speziellen, durch http erreichbaren Verzeichnis unter einem zufälligen Dateinamen ablegen und diesen Namen dann als src="meinthumbname.jpg" in die response einbauen oder Du produzierst aus der Session ein 'Thumbnail on the fly'. Dazu benötigst Du eine Funktion, die auf

      <image src="meinbild.php" alt="Vorschaubild" />

      eben mittels der Ressource meinbild.php in der aktuellen Session schaut, ob unter

      $_SESSION[$fieldname]['content']

      ein sinniger Eintrag besteht, und dieser ein Bild ist
      http://www.php.net/manual/de/function.imagecreatefromstring.php

      Nach dem Resizen mit
      http://www.php.net/manual/de/function.imagecopyresized.php

      oder Resamplen mit
      http://www.php.net/manual/de/function.imagecopyresampled.php

      kannst Du es dann mit
      [http://www.php.net/manual/de/function.imagejpeg.php]

      wieder an den Client ausgeben.
      Vergiss nicht, den JPG-Content-Header davor zu setzen.

      Alternativ kann man bei größeren Bildern auch eine temporäre Bilddatei im Session-Verszeichnis ablegen. Das ist nicht ganz einfach, weil man einen gültigen Sessionnamen erzeugen muss, ohne wirklich eine Session zu starten für das Bild. Aber es funktioniert prima und abgelaufene Bilder werden so genauso wieder aufgeräumt nach einiger Zeit, wie abgelaufene Sessions.

      Liebe Grüße aus Syburg bei Dortmund

      Tom vom Berg

      Liebe Grüße aus Syburg bei Dortmund

      Tom vom Berg

      --
      Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de