Cedo: 10 Bilder auf einmal hochladen und bearbeiten, Speicher Problem?

Die letzten Postings waren sehr interessant zum Thema upload, und dazu habe ich dann auch noch eine weitere Frage für was danach passiert.....

Ich möchte mehrere Bilder gleichzeitig hochladen und anschließend bearbeiten.
Es können bis zu 10 Bilder hochgeladen werden, bis je max. 4 MB.

Von diesen Bildern sollen dann jeweils 2 Versionen gespeichert werden, müssen also auf dem Sever erstellt werden.

Ein Vorschaubild (100x100 Pixel) und ein Ansichtsbild (500x500Pixel).
Wie bekomme ich das hin ohne den Server groß zu belasten, bzw. dass er die Bearbeitung nicht abbricht.

Meine Angst ist diese, wenn ich das mit einem einzigen Bild mache, das 4 MB Gross ist und das dann in die beiden 2 Versionen umgewandelt wird ist der benutze Memoryspeicher schon groß. Wenn ich es aber mit 10 Bildern gleichzeitig mache, wird dann der Memoryspeicher mit 10x4 MB belegt oder hintereinander, so das es nicht viel ausmacht?

Cedo

  1. Hallo Cedo,

    Ein Vorschaubild (100x100 Pixel) und ein Ansichtsbild (500x500Pixel).
    Wie bekomme ich das hin ohne den Server groß zu belasten, bzw. dass er die Bearbeitung nicht abbricht.

    Bis 10 Bilder bearbeitet sind wirst du wohl in den timeout des Scriptes laufen - du solltest also entweder den timeout auf 0 (=Unendlich) bzw. einen höheren Wert setzen oder nur 3 Bilder oder so auf einmal zulassen.

    Meine Angst ist diese, wenn ich das mit einem einzigen Bild mache, das 4 MB Gross ist und das dann in die beiden 2 Versionen umgewandelt wird ist der benutze Memoryspeicher schon groß. Wenn ich es aber mit 10 Bildern gleichzeitig mache, wird dann der Memoryspeicher mit 10x4 MB belegt oder hintereinander, so das es nicht viel ausmacht?

    Das kommt darauf an wie du das programmierst - aber normalerweise solltest du nach jedem Bild die entsprechenden Ressourcen wieder freigeben dann brauchst du jeweils nur den Speicher der für das gerade zu bearbeitende Bild nötig ist. Allerdings brauchst du für ein 4MB-Bild nicht nur 4MB Speicher sondern deutlich mehr: du musst mit ca. x*y*4 Byte rechnen (x und y sind die Abmessungen in px des Bildes) - evtl. musst du also memory_limit hochsetzen.

    Gruß,
    Tobias

    1. Moin!

      Die Bearbeitung ist nicht Dein Problem, denn die Bilder werden nacheinander bearbeitet. Wichtiger wäre zu wissen, ob Browser oder Server beim Upload in ein Timeout laufen oder ob eines der Limits für die Datenübertragung erreicht wird, respektive ob Du das beeinflussen kannst.

      Dein Vorhaben ist also von Sachverhalten abhängig, die Du nicht beschrieben hast. Ist es ein Projekt, dass öffentlich via Internet zur Verfügung stehen soll? Oder ein Projekt in einem lokalen Netzwerk? Wer verwaltet den (Web-)Server, welchen Server auf welchem OS ...

      Vor einer möglichen Antwort stehen also Fragen.

      MFFG (Mit freundlich- friedfertigem Grinsen)

      fastix

  2. Hi!

    Ich möchte mehrere Bilder gleichzeitig hochladen und anschließend bearbeiten.
    Von diesen Bildern sollen dann jeweils 2 Versionen gespeichert werden, müssen also auf dem Sever erstellt werden.
    Wie bekomme ich das hin ohne den Server groß zu belasten, bzw. dass er die Bearbeitung nicht abbricht.

    Indem du die Aufgabe an einen anderen Prozess delegierst, dem mehr Speicherverbrauch gestattet ist, falls dein PHP hier begrenzt ist. Mir ist kein Verfahren bekannt, das aus komprimierten Grafikdaten Änderungen vornehmen können, ohne das Bild zu dekomprimieren. Theoretisch geht sowas sicherlich, aber der Aufwand wird nicht gerade klein sein. Das Bild zu entpacken und dann die Grafikroutinen anzuwenden ist einfacher. Anschließend muss ja auch das gesamte Bild bewertet werden, um zu sehen, welche Farben und andere Merkmale man rauskomprimieren kann.

    Meine Angst ist diese, wenn ich das mit einem einzigen Bild mache, das 4 MB Gross ist

    4MB Dateigröße eines komprimierenden Formates sind ausgepackt deutlich mehr.

    und das dann in die beiden 2 Versionen umgewandelt wird ist der benutze Memoryspeicher schon groß.

    Beim Bearbeiten werden üblicherweise gleichzeitig mehrere Arbeitskopien benötigt.

    Wenn ich es aber mit 10 Bildern gleichzeitig mache,

    Mir ist keine PHP-Version bekannt, in der eine Script-Instanz mehrere Vorgänge nebeneinander laufen lassen kann. Der Speicherverbrauch ist jedoch schon bei der Bearbeitung eines hochauflösenden Bildes nicht zu vernachlässigen.

    Lo!

  3. Hi,

    ich nutze für den Bildupload Uploadify. Das kann ich dir nur auch empfehlen.

    1. Kannst du bequem alle Bilder auf einmal auswählen, anstatt jedes einzeln über "Durchsuchen" etc. auswählen zu müssen.

    2. Das Ziel-Skript wird mit jedem Bild gesondert aufgerufen. Wenn also irgendwo ein Fehler passiert ist diese völlig isoliert und alles andere läuft normal weiter. So bekommst du auch kaum Timeout-Probleme. Aber den nötigen Arbeitsspeicher brauchst du natürlich trotzdem.

    3. Beim Arbeitsspeicher hilft aber in Uploadify eine Einstellung mit der du festlegen kannst, wie viele Bilder gleichzeitig hochgeladen werden sollen. Wenn du da 3 einstellst, kannst du z.B. 15 Bilder auswählen, auf hochladen klicken und Uploadify lädt dann automatisch jeweils 3 Bilder hoch.

    Uploadify war nach meiner Recherche das beste MuliUpload-Tool, vor allem auch wegen dem tollen Forum, wo man wirklich zu jedem Problem sofort eine Antwort findet.

    Ich habe es gerade mal mit den 15 größten Bildern, die ich auf die schnelle finden konnte - leider nur ca, 2,5MB pro Bild - getestet. Hat ohne Probleme geklappt.

    Gruß
    Alex

    1. Moin!

      Hi,

      ich nutze für den Bildupload Uploadify. Das kann ich dir nur auch empfehlen.

      Ich nicht. Es ist gefährlich.

      Hier ist der Quellcode aus der aktuellen stabilen Version 2.1.4 (uploadify.php):

      if (!empty($_FILES)) {  
      	$tempFile = $_FILES['Filedata']['tmp_name'];  
      	$targetPath = $_SERVER['DOCUMENT_ROOT'] . $_REQUEST['folder'] . '/';  
      	$targetFile =  str_replace('//','/',$targetPath) . $_FILES['Filedata']['name'];  
      	  
      	// $fileTypes  = str_replace('*.','',$_REQUEST['fileext']);  
      	// $fileTypes  = str_replace(';','|',$fileTypes);  
      	// $typesArray = split('\|',$fileTypes);  
      	// $fileParts  = pathinfo($_FILES['Filedata']['name']);  
      	  
      	// if (in_array($fileParts['extension'],$typesArray)) {  
      		// Uncomment the following line if you want to make the directory if it doesn't exist  
      		// mkdir(str_replace('//','/',$targetPath), 0755, true);  
      		  
      		move_uploaded_file($tempFile,$targetFile);  
      		echo str_replace($_SERVER['DOCUMENT_ROOT'],'',$targetFile);  
      	// } else {  
      	// 	echo 'Invalid file type.';  
      	// }  
      }
      

      Damit landen Dateien - wie z.B. eine schicke shell.php - dort, wo Du sie gewiss nicht haben willst.

      Der Rest ist dann ziemlich egal. Tolle Funktionen, die zu einem grandiosen Sicherheitsdesaster führen.

      MFFG (Mit freundlich- friedfertigem Grinsen)

      fastix

      1. Hello Fastix,

        ich nutze für den Bildupload Uploadify. Das kann ich dir nur auch empfehlen.

        Ich nicht. Es ist gefährlich.

        Scheint mir nach kurzer Inaugenscheinnahme (*g*) auch so zu sein.

        Hier ist der Quellcode aus der aktuellen stabilen Version 2.1.4 (uploadify.php):

        if (!empty($_FILES)) {

        $tempFile = $_FILES['Filedata']['tmp_name'];
        $targetPath = $_SERVER['DOCUMENT_ROOT'] . $_REQUEST['folder'] . '/';
        $targetFile =  str_replace('//','/',$targetPath) . $_FILES['Filedata']['name'];

        // $fileTypes  = str_replace('*.','',$_REQUEST['fileext']);
        // $fileTypes  = str_replace(';','|',$fileTypes);
        // $typesArray = split('|',$fileTypes);
        // $fileParts  = pathinfo($_FILES['Filedata']['name']);

        // if (in_array($fileParts['extension'],$typesArray)) {
        // Uncomment the following line if you want to make the directory if it doesn't exist
        // mkdir(str_replace('//','/',$targetPath), 0755, true);

          move_uploaded_file($tempFile,$targetFile);  
          echo str_replace($_SERVER['DOCUMENT_ROOT'],'',$targetFile);  
        

        // } else {
        // echo 'Invalid file type.';
        // }
        }

        
        >   
        >   
        > Damit landen Dateien - wie z.B. eine schicke shell.php - dort, wo Du sie gewiss nicht haben willst.  
        >   
        > Der Rest ist dann ziemlich egal. Tolle Funktionen, die zu einem grandiosen Sicherheitsdesaster führen.  
          
        <sarkasmus>Aber es wurde doch "move\_uploaded\_file()" benutzt.  
         Dann muss das soch sicher sein, oder? </sarkasmus>  
          
          
          
        Liebe Grüße aus dem schönen Oberharz  
          
          
        Tom vom Berg  
        ![](http://selfhtml.bitworks.de/Virencheck.gif)  
          
        
        -- 
         ☻\_  
        /▌  
        / \ Nur selber lernen macht schlau  
        <http://bergpost.annerschbarrich.de>
        
        1. Hi,

          <sarkasmus>Aber es wurde doch "move_uploaded_file()" benutzt.
          Dann muss das soch sicher sein, oder? </sarkasmus>

          Es wurde auch $_FILES benutzt. Laut einem gewissen Tom muss es dann ja sicher sein.

          MfG ChrisB

          --
          RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
          1. Moin!

            <sarkasmus>Aber es wurde doch "move_uploaded_file()" benutzt.
            Dann muss das soch sicher sein, oder? </sarkasmus>

            Es wurde auch $_FILES benutzt. Laut einem gewissen Tom muss es dann ja sicher sein.

            Lasst das. Es ist hässlich für die Mitleser.

            MFFG (Mit freundlich- friedfertigem Grinsen)

            fastix

      2. Hi,

        Ich nicht. Es ist gefährlich.

        Hast du dich schon mal nach einem Multiuploader (oder wie auch immer das heißt) umgesehen? Was würdest du empfehlen? Ich habe sehr lange gesucht. Es gibt da viel. Aber von den kostenlosen ist Uploadify echt das Beste gewesen.

        Sowas programmiert ja normal kein Mensch selber, aber man muss es eben manchmal in seinem Projekt verwenden, da ein User heutzutage sowas in gewissen Bereichen einfach erwartet. Also nimmt man das was es gibt.

        Einer der Hauptgründe, wieso Uploadify so gut ist, ist die Tatsache, dass man es enorm gut selbst anpassen kann. Aber hier bei der Gefahr redenw ir ja eh nur über den PHP-Empfangsteil - also das was man in aller Regel sowieso anpassen muss und das was hier wohl eher als Beispiel von Uploadify dient, als als praxistaugliche Lösung.

        Ich habe nicht nachgeguckt. Aber falls Uploadify wirklich nicht vor den Sicherheitsrisiken warnt ist das in der Tat ein Manko, denn ein Hinweis wäre doch sehr hilfreich.

        Aber wenn es nur um Bilder gehen soll, kann man z.B. in Toms neuem Artikel zum Fileupload ja sehr gut nachlesen, wie man eine Sicherheitsprüfung macht.

        Gruß
        Alex

        1. Hi there,

          Sowas programmiert ja normal kein Mensch selber, [...]

          Ah so?

          Aber wenn es nur um Bilder gehen soll, kann man z.B. in Toms neuem Artikel zum Fileupload ja sehr gut nachlesen, wie man eine Sicherheitsprüfung macht.

          Und wozu brauchst Du dann 'Uploadify'?

          1. Hi,

            Sowas programmiert ja normal kein Mensch selber, [...]

            Ah so?

            Ich mache meiner Meinung nach vergleichsweise sehr viel selbst und greife nicht imm gleich zu einer fertigen Lösung oder einem Framework. Aber so einen MultiUploader selbst zu bauen ist mir echt noch nicht in den Sinn gekommen - aber vielleicht auch, weil ich mich mit Flash und den Techniken die für sowas nötig sind nicht so toll auskenne.

            Also: Meinetwegen machen es manche Menschen selbst, aber ich denke, dass der Großteil wohl doch zu einer fertigen Lösung greift.

            Aber wenn es nur um Bilder gehen soll, kann man z.B. in Toms neuem Artikel zum Fileupload ja sehr gut nachlesen, wie man eine Sicherheitsprüfung macht.

            Und wozu brauchst Du dann 'Uploadify'?

            Dir ist schon klar, was Uploadify ist, oder?

            Uploadify ermöglicht es durch ein Flash- und Javascript-Programm (glaube ich), mehrere Dateien auszuwählen und diese dann hübsch gestaltet (CSS) und bequem (JavaScript) an den Server zu senden.

            Für alles was danach kommt ist Uploadify nicht im geringsten zuständig. Die Daten könnten genauso gut von einem normalen HTML-Formular kommen, das interessiert den Server (PHP, in meinem Fall) nicht.

            Also ist sowas sehr wohl relevant.

            Und nochmal: Ich würde diesen PHP-Code der bei Uploadify dabei ist nicht unbedingt zu Uploadify zählen. Das ist einfach nur ein Beispiel und eine Hilfe, dass man schnell mal das komplette Programm durchziehen kann.

            Um damit aber richtig zu arbeiten muss man das PHP-Skript aber natürlich massiv anpassen. Man lädt die Dateien ja schließlich nicht zum Spaß hoch und lässt sie da vergammeln, sondern man will etwas bestimmtes damit anstellen und das muss ja irgendwie bearbeitet werden.

            Gruß
            Alex