Ankündigung

Einklappen
Keine Ankündigung bisher.

Zip entpacken und Blob erstellen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Zip entpacken und Blob erstellen

    Hallo,
    ich möchte gern eine Zip-Datei hochladen in welcher sich ausschließlich Fotos im Format JPG befinden.

    Ein entsprechendes Uploadformular habe ich mir schon gebastelt.

    Die Zip Datei zu entpacken klappt auch wunderbar, jedoch möchte ich die Zip Datei gar nicht erst groß in einen Ordner entpacken sondern direkt Foto für Foto abarbeiten und gleich die Fotos als Blob an die Datenbank geben.


    Für den Blob nutze ich folgendes Script:

    PHP-Code:
    $type $_FILES['userfile']['type'];
    $data addslashes(fread(fopen($tmp_name"r"), filesize($tmp_name)));
    db_connect();
    $query "INSERT INTO blob (imgdata,imgtype) VALUES ('$data','$type')" ;
    mysql_close() 
    Jedoch hab ich im Moment keine Ahnung wie ich die einzelnen Fotos am besten an mein "Blob-Script" gebe. Ist dies überhaupt im Rahmen des möglichen (also sozusagen im Temp Verzeichnis Stück für Stück entpacken und gleich an die DB zu übergeben, ohne erst in ein Extra Verzeichnis entpacken zu müssen)?

    Beste Grüße
    nofear87

  • #2
    Prinzipiell ist es eine Schlechte Idee Bilder ( oder allgemein Große Files ) in die Datenbank zu nageln, ich würde an deiner Stelle eher hingehen und die Bilder einzeln gz-compressed auf dem Webspace ablegen. Und entsprechend wenn sie benötigt werden je nach ACCEPT-Header des Clients sie gz-compressed oder decompressed an den Client weitergeben, incl. If-Modified-Since Mechanik.

    Was in der Datenbank dann laden könnte wär ein sha1_file()-hash der Datei, dessen MIME-Typ und ggf. Meta-(EXIF-)Infos des Bildes.

    Solltest du aus multi-host verfügbarkeits Gründen die Files in eine Datenbank schaufeln wollen, solltest du das ganz schnell vergessen und lieber sofort auf memCache und einen Warden-Cron zum injiziieren der Files in den memCache-Cache zurückgreifen. Denn der ist spielend cluster'bar.

    Kommentar


    • #3
      danke erst mal, es handelt sich nicht um viele Fotos.

      In die DB will ich sie deshalb packen, weil mir eben nur eine DB zur Verfügung steht und kein Filespace.

      Kommentar


      • #4
        dann pack sie gzcompressed in die DB und halt sie so klein ( Auflösung ) wie möglich. Bedenke das auch bei BLOB feldern beim Zugriff auf die Tables bei einigen Datenbank-Engines die BLOB-Felder mitgeladen werden und nicht erst bei ihrem Expliziten SELECT.

        Das HowTo steht da:
        http://www.php-mysql-tutorial.com/wi...-database.aspx

        Kommentar


        • #5
          die Fotos sind ja gezipped und ich weiß nicht wie ich an die Fotos einzeln herankomme um sie einzeln in die Datenbank zu bringen, das ist das eigentliche Problem.

          Wenn ich sie dann einzeln entpackt im Temp habe und ihren Pfad kenne ist mir das weitere vorgehen klar.

          Denn ich will ja nicht das komplette Zip File in die DB packen.

          Kommentar


          • #6
            Mit gzcompressed mein ich nicht zip!

            - http://php.net/manual/de/function.gzcompress.php

            Auspacken kannst du dein Archiv on-the-fly mit ( hier mal beispiele ):

            - http://www.php.net/manual/de/zip.examples.php

            indem du:
            PHP-Code:
            $zipfile = new ZipArchive('myzip.zip');

            $toBlob $zipfile->getFromName('myimage.jpg');

            /* ... */ 
            nutzt.

            Einige Datenbank-Treiber in PHP können auch fopen()-Ressourcen verwenden ( PDO ) und direkt in die Blobs streamen.

            Kommentar


            • #7
              Hey, das ist ja super, dann hab ich jetzt sozusagen das Foto in der Variable.

              und müsste jetzt nur noch addslashes darauf anwenden und es als Blob in die DB schreiben (mal von der Komprimierung abgesehen)

              Aber um es später auszugeben muss ich noch an den Dateityp kommen und ich möchte auch gern die IPTC Infos auslesen. bekomme ich den irgendwie aus der Variable ausgelesen?

              PHP-Code:
              $size getimagesize("pfad"$info);
              if (isset(
              $info["APP13"])) {
                
              $iptc iptcparse($info["APP13"]);
                
              var_dump($iptc);

              Doch hierzu benötige ich immer einen Pfad zu einer Datei, den ich ja nicht habe, wenn die Datei in der Variable steckt...oder?

              Kommentar


              • #8
                Mit entsprechendem (Stream-)Wrapper kannst du das mit

                http://www.php.net/manual/de/functio...-imagetype.php

                bzw.

                http://php.net/manual/de/function.getimagesize.php
                http://php.net/manual/de/function.iptcparse.php

                auslesen, ja.

                Kommentar


                • #9
                  Danke

                  Wie bekomme ich diesen Stream hin bzw. wo kann ich hierzu was finden? Ist leider für mich absolutes Neuland. Ist das Hardwareseitig? Bzw. bedarf es da bestimmter Einstellungen am System?

                  Kommentar


                  • #10
                    Handbuch
                    - http://php.net/manual/en/book.stream.php
                    - http://php.net/manual/de/function.st...r-register.php

                    Guide
                    - http://etutorials.org/Server+Adminis...ting+Wrappers/

                    Kommentar


                    • #11
                      puhh...das ist mir gerade etwas zu hoch

                      imagecreatefromstring() kann ich aus dieser Funktion was machen?

                      Kommentar


                      • #12
                        kann man die Zip Datei nicht irgendwie im Temp Verzeichnis des Servers entpacken und sich die Links zu den entpackten Dateien holen? Das würde irgendwie vieles leichter machen.

                        Denn dann komm ich an die Infos...da ich ja einen Pfad habe und ich kann sie auch in einen Blob packen.

                        Kommentar


                        • #13
                          Jo klar kannst du auch imagecreatefromstring() nutzen um an die Daten zu kommen, allerdings kommst du ins Schwindeln wenn die entpackten Bilder größer sind als der PHP-Runtime-Instanz des Apaches an Memory-Limit zu gewiesen wurde. Streams verhindern das, funktionen die mit streams klarkommen ( gerade exif_* ), öffnen eh nicht das ganze file, sondern nur den interessanten Part. In Summe hast du mit Streams in dem Fall auch genügend Performance gewinn, so dass das ganze nach dem Upload zügig in die Datenbank "gedrückt" wird.

                          Entpacken -> Öffnen kommt in dem Fall aufs gleiche heraus, da du mit getimagesize() dann anfängst die ganze Datei zu öffnen.

                          Es ist relativ simple zu lösen, nutz einfach die getStream()-Methode von ZipArchive. Ich bastel dir mal kurz was damit du einen Ansatz zum Stream-Fetching via php hast.

                          Kommentar


                          • #14
                            das ist echt nett von dir...da bin ich ja schon mal gespannt.

                            derzeit sieht mein Script so aus:

                            PHP-Code:
                                            $tmp_pfad $_FILES['file']['tmp_name'];
                                            
                            $zip_inhalt = array();
                                            
                            $zip zip_open($tmp_pfad);
                                            if (
                            $zip) {
                                                   while (
                            $zip_entry zip_read($zip)) {
                                                     
                            array_push($zip_inhalt,zip_entry_name($zip_entry));
                                                 }
                                            }
                                            
                            $zip = new ZipArchive;
                                            
                            $zip->open($tmp_pfad);
                                            foreach (
                            $zip_inhalt as $dateiname){
                                                
                            $toBlob $zip->getFromName($dateiname);
                                                
                            $data addslashes($toBlob);
                                                
                            db_connect();
                                                
                            $query "INSERT INTO blobdata (data) VALUES ('$data')";
                                                if (!
                            mysql_query$query)) die(mysql_error());
                                                
                            mysql_close;
                                            } 
                            vielleicht gibt es ja noch Verbesserungsvorschläge

                            Kommentar


                            • #15
                              So.. Streams nachbau'n is nicht nötig, getimagesize kann zip's öffnen mit dem schon existierenden Wrapper für ZipArchive.

                              PHP-Code:
                                  $zipFile = new ZipArchive();
                                  
                              $zipFile->open('test.zip');
                                  
                                  
                              $archiveImageData = array();
                                  
                                  foreach ( 
                              range(0$zipFile->numFiles 1) as $imageIndex ) {
                                      
                              $data getimagesize('zip://./test.zip#'.$zipFile->getNameIndex($imageIndex), $info );
                                      
                              $archiveImageData$zipFile->getNameIndex($imageIndex) ] = $info;
                                      unset(
                              $info);
                                  }
                                  
                                  
                              var_dump($archiveImageData); 
                              Schaut dann im prinzip so aus. Das mit den Blobs ist realtiv simpel gehalten:

                              - http://php.net/manual/de/book.pdo.php
                              - http://www.php.net/manual/de/pdo.prepare.php
                              - http://www.php.net/manual/de/pdostatement.bindparam.php
                              - http://www.php.net/manual/de/pdo.constants.php

                              Beispiel:
                              http://www.php.net/manual/de/pdo.lobs.php

                              Statt fopen(), ZipArchive::getStream() nutzen.

                              Verbesserungsvorschläge für "da oben":
                              - nicht in einer schleifen die datenbankverbindung aufbauen.

                              Kommentar

                              Lädt...
                              X