Ankündigung

Einklappen
Keine Ankündigung bisher.

Blob

Einklappen

Neue Werbung 2019

Einklappen
Dieses Thema ist geschlossen.
X
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Blob

    Ich splitte im Javascript ein Bild aus einem HTML5 File Field.
    Code:
    var reader = new FileReader();
    
          reader.onloadend = function () {
            var image_parts = [];
            // Since it contains the Data URI, we should remove the prefix and keep only Base64 string
            var b64 = reader.result.replace(/^data:.+;base64,/, "");
            var currten_index = 0;
    
            // Spliting the b64 string in parts.
            while (b64.length > currten_index) {
              var start_split = currten_index;
              var end_split =
                currten_index +
                Math.min(b64.length - currten_index, _sliceSize);
              var b64_substr = b64.substr(start_split, end_split - start_split);
    
              image_parts.push(b64_substr);
    
              currten_index = end_split;
            }
    
            // Clean Memory
            delete b64;
    
            // Upload Image
            uploadImageArray(image_parts, start_split, end_split, picIndex, psyToken, psyKey);
          };
    
          reader.readAsDataURL(file);
    Das funktioniert. Der Upload per Ajax klappt auch. Ich kann die einzelnen Datenpakete auf dem Server in Textfile speichern, dann wieder auslesen, zusammensetzen und daraus das Bild wieder herstellen.
    Nun möchte ich das aber in eine MySql-DB speichern. Und da weigert sich mysql das anzunehmen.
    Ich bekomme die Meldung:
    Code:
    <br />
    <b>Warning</b>:  mysqli_query(): MySQL server has gone away in <b>D:\xampp\htdocs\projekte\uploadNew\upload2\DB\classesDB.php</b> on line <b>210</b><br />
    <br />
    <b>Warning</b>:  mysqli_query(): Error reading result set's header in <b>D:\xampp\htdocs\projekte\uploadNew\upload2\DB\classesDB.php</b> on line <b>210</b><br />
    REPLACE INTO psy_pic_cache (`session`, token, `key`, pic_index, part_id, parts_all, num_all, `start`, `end`, width, height, file_type, file_name, file_data) VALUES ('c9gk1iqgvuhla64pm4pe9t01to', '123456abcdefg', 'hijklmnop9874652', 2, 11, 14, 10, 26624000, 26959588, 0, 0, 'image/png', 'DSC03192.png', 'R3bAy+k5AG/ZXlW7anHVwZX3vPckg5Icc4qsEgOmAGZePexsfchorglMR8TAljt1VWWp2bMGdsW24BQBD......'
    Die Daten im Datenbankfeld file_data habe ich jetzt gekürzt. Das wäre sonst für das Forum hier zu groß. Das Datenpaket ist jedenfalls in echt 2MB groß. Und ist ja letztendlich nur ein String.

    In meiner Datenbankklasse steht das an Zeile 210 (falls einer fragt)
    $this -> result = mysqli_query($this -> verbindung, $mysql);
    Und $mysql enthät genau den obigen query String.
    Aber das funktioniert bei allen meine Anwendungen, nur hier eben nicht.

    Das ist meine Tabelle, in die das rein soll:
    Code:
    CREATE TABLE `psy_pic_cache` (
        `session` VARCHAR(50) NOT NULL DEFAULT '0' COLLATE 'utf8_unicode_ci',
        `token` VARCHAR(50) NOT NULL DEFAULT '0' COLLATE 'utf8_unicode_ci',
        `key` VARCHAR(50) NOT NULL DEFAULT '0' COLLATE 'utf8_unicode_ci',
        `pic_index` INT(5) NOT NULL DEFAULT '0',
        `part_id` INT(5) NOT NULL DEFAULT '0',
        `parts_all` INT(8) NULL DEFAULT NULL,
        `num_all` INT(8) NULL DEFAULT NULL,
        `start` BIGINT(20) NULL DEFAULT NULL,
        `end` BIGINT(20) NULL DEFAULT NULL,
        `width` BIGINT(8) NULL DEFAULT NULL,
        `height` BIGINT(8) NULL DEFAULT NULL,
        `file_type` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
        `file_name` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
        `file_data` LONGBLOB NULL DEFAULT NULL,
        `tsp` TIMESTAMP NULL DEFAULT current_timestamp(),
        PRIMARY KEY (`session`, `token`, `key`, `pic_index`, `part_id`) USING BTREE
    )
    COMMENT='Upload Daten '
    COLLATE='utf8_unicode_ci'
    ENGINE=InnoDB;
    Der Longblob kann Dateien bis zu 4GB aufnehmen. Wieso steigt ann bei den 2MB das MySql aus? Wenn ich die Datenmenge verringere, indem ich einfach ein Drittel rauslösche, schreibt er das in die DB. Wieso sind reine 2MB Text zu groß für ein Longblob Feld? Ich lege die Textdatei eines solchen Datenpaketes mal auf meine Server zum ansehen.
    http://download.psygonis.de/2_12_14_image_data_.data
    Was mache ich da falsch?


  • #2
    Nachdem der PHP-Code unbekannt ist, kann ich nur Vermutungen anstellen. Kanns sein, dass du die Daten direkt in den SQL-Code schreibst? Das sollte natürlich nicht gemacht werden.

    https://www.php.net/manual/de/mysqli...-long-data.php

    https://www.php.net/manual/de/pdo.lobs.php

    Und ich versteh nicht ganz, warum du Bilder in Text umwandelst. Warum die Bilddaten nicht so wie sie sind an den Server senden?

    Kommentar


    • #3
      Zitat von hellbringer Beitrag anzeigen
      Nachdem der PHP-Code unbekannt ist, kann ich nur Vermutungen anstellen. Kanns sein, dass du die Daten direkt in den SQL-Code schreibst? Das sollte natürlich nicht gemacht werden.

      https://www.php.net/manual/de/mysqli...-long-data.php

      https://www.php.net/manual/de/pdo.lobs.php

      Und ich versteh nicht ganz, warum du Bilder in Text umwandelst. Warum die Bilddaten nicht so wie sie sind an den Server senden?
      Ja, ich habe die Daten direkt in den sql Code geschrieben, das ist doch nur Text, der Longblob fasst 4GB, also warum nicht. Das ganze Datenpaket ist zwei MB und max_allowed_packet steht auf 128MB. Ich hab da kein Problem gesehen.
      Und ich mache das, weil es Browser gibt, die den Upload ab einer bestimmten Größe verhindern. Deswegen müssen die Bilder gesplittet werden.
      Danke für den Link. Natürlich kann ich send_long_data benutzen. Es ist mir nur nicht klar warum, weil die Datenpakete ja nicht größer sind, als der Server zulässt.

      Kommentar


      • #4
        Zitat von psygonis Beitrag anzeigen
        Ja, ich habe die Daten direkt in den sql Code geschrieben, das ist doch nur Text, der Longblob fasst 4GB, also warum nicht.
        Du widersprichst dir in einem Satz. Einmal ist es Text, und dann plötzlich ein Blob, Also was jetzt? Ein Text ist kein Blob.

        Zitat von psygonis Beitrag anzeigen
        Das ganze Datenpaket ist zwei MB und max_allowed_packet steht auf 128MB. Ich hab da kein Problem gesehen.
        Aber das ist trotzdem aus mehreren Gründen Unsinn.

        Zitat von psygonis Beitrag anzeigen
        Und ich mache das, weil es Browser gibt, die den Upload ab einer bestimmten Größe verhindern. Deswegen müssen die Bilder gesplittet werden.
        Welche Browser sind das? So einer ist mir noch nie untergekommen. Ich habe mit den verschiedensten Browser schon Datenmengen jenseits der 2 Gigabyte hochgeladen. Geht problemlos.

        Zitat von psygonis Beitrag anzeigen
        Danke für den Link. Natürlich kann ich send_long_data benutzen. Es ist mir nur nicht klar warum, weil die Datenpakete ja nicht größer sind, als der Server zulässt.
        Man kann sich jetzt natürlich den Kopf darüber zerbrechen, warum dein suboptimaler Ansatz nicht funktioniert. Oder man macht es einfach gleich richtig und spart sich das.

        Kommentar


        • #5
          Zitat von hellbringer Beitrag anzeigen
          Welche Browser sind das? So einer ist mir noch nie untergekommen. Ich habe mit den verschiedensten Browser schon Datenmengen jenseits der 2 Gigabyte hochgeladen. Geht problemlos.
          Safari auf dem IPhone
          Man kann sich jetzt natürlich den Kopf darüber zerbrechen, warum dein suboptimaler Ansatz nicht funktioniert. Oder man macht es einfach gleich richtig und spart sich das.
          Das ist schon wieder die pure Überheblichkeit. Es ist jedes Mal das Gleiche. Man, Du bist nicht Gott, nur weil Du mehr weißt als andere!

          Kommentar


          • #6
            Mach mal testweise aus der innodb Tabelle eine myisam.

            Kommentar


            • #7
              Zitat von psygonis Beitrag anzeigen
              Das ist schon wieder die pure Überheblichkeit. Es ist jedes Mal das Gleiche. Man, Du bist nicht Gott, nur weil Du mehr weißt als andere!
              Du willst es jetzt also aus Trotz nicht richtig machen, oder was ist dein Fazit?

              Kommentar


              • #8
                <-- Textpassage entfernt -->

                Da geht es um Bildgestaltung im Netz über Ajax mit Canvas. Da müssen im Canvas modifizierte Bilder auf den Server gebracht werden. Dazu auch die Originale. Das passiert, wie der Name Ajax ja bereits sagt, im Hintergrund. Und diese Anwendung muss auf allen Systemen im Browser funktionieren. Der Safari auf dem IPhone hat eine eigene Größenprüfung, der zeigt weder zu große Canvas Elemente an, noch lädt der zu große Bilder (über ca. 5MB) noch hält der sich an die Abschaltung des Anti Aliasing im Canvas. Da haben wir immer spezielle Lösungen und jetzt gehen wir die Lösung des Problem mit den großen Bildern an. Bis jetzt haben wir das Canvas zerschnitten und Einzelbilder geladen und auf dem Server wieder zusammengesetzt, das hat nur den Nebeneffekt, das die Bilder auf dem Server alle nur 72 DPI haben, weil Canvas keine größerer Auflösung unterstützt. Ich arbeite daran seit über 10 Jahren. Klar, ich weiß nicht alles, ich lerne immer wieder etwas dazu, wenn ich mich mit anderen Problemen befassen. Aber ich habe es nicht nötig, mich von einem "selbsternannten Programmiergott" an dämlich bezeichnen zu lassen, nur weil ich mal einen, in seinen Augen, falschen Ansatz benutze. Vor allem war das nicht der Inhalt meiner Frage. Ich werde auch keine Programmierungen, die in zig Klassen und 1000den Methoden definiert sind, einfach ändern, weil der Herr meint, so wäre es besser. Wenn ich, ich betone ich!!!, zu dem Schluss komme, dass Deine Lösung besser ist, dann setze ich die auch ein. Aber dazu muss ich die erst mal verstehen.

                Wenn Du meinst, ich kenne den Unterschied zwischen Text und Blob nicht, dann erkläre es doch. Wenn Du meinst, für meine Anwendung sollte ich lieber Text als Blob benutzen, dann erkläre mir warum.

                Wie Du siehst, steht in meinem Post, wie ich das Bild im Javascript zerschneide. Durch die Benutzung des FileReaders, habe ich da eine sogenannte DataURL, also einen String der dann base64 codiert wird. Für mich ist das ein Blob. Diese Daten werden auf den Server geladen. Wenn ich die in einem Textfile speichere, sieht das so aus wie in dem Anhang. Das will ich in der Datenbank speichern. Die Größe dieses Files ist 2MB. Egal ob ich in der Tabelle das Feld als LongBlob oder als Longtext definiere, es funktioniert nicht. Kürze ich das File, funktioniert es.

                Die Frage ist also, wie bekomme ich die Daten in die Datenbank? Ob Blob oder Text, ob auf einmal im sql String oder send_long_data muss man eben herausfinden oder auch wissen und dann anwenden. Da ich es nicht weiß, Du aber offensichtlich schon, warum erklärst Du es dann nicht mal. Einen Link senden, aus dem Manual kann jeder 6. Klässler und dabei ist es auch vollkommen egal, ob der weiß was er da postet oder nicht.
                Aber damit seinem Wissen protzen, es aber vor allen geheim halten, ist bestimmt nicht zielführend.

                Ich bitte schon mal vorsorglich um Entschuldigung, aber das musste einfach mal raus.

                Kommentar


                • #9
                  Zitat von erc Beitrag anzeigen
                  Mach mal testweise aus der innodb Tabelle eine myisam.
                  Zeigt keine Wirkung

                  Kommentar


                  • #10
                    Folgender neuer Versuch
                    Code:
                    $this -> verbindung = mysqli_connect($this -> host, $this -> user, $this -> pass, $this -> dbase) or die ("Keine Verbindung m&ouml;glich. Pr&uuml;fen Sie die Zugangsdaten oder wenden Sie sich an den Administrator.<br>Host: ".$this -> host." User: ".$this -> user." Pass: ".$this -> pass." DB: ".$this -> dbase." Choise: ".$serverChoice);
                    Das funktioniert in meiner gesamten Anwendung
                    Jetzt die Methode zum schreiben
                    Code:
                      function psySendLongData($mysql, $fieldID, $data){
                        $stmt = mysqli_prepare($this -> verbindung, $mysql);
                        mysqli_stmt_bind_param($stmt, "b", $txt);
                        $txt = NULL;
                        mysqli_stmt_send_long_data($stmt, $fieldID, $data);
                        mysqli_stmt_execute($stmt);
                        }
                    Laut Beispiel https://www.tutorialspoint.com/php/p..._long_data.htm

                    Mein Aufruf der Methode in der DB Klasse
                    Code:
                    function setPicPartDataInDB($p_psySession, $p_psyToken, $p_psyKey, $p_picIndex, $current_part_id, $amount_of_parts, $p_numOfSlices, $p_start, $p_end, $p_picWidth, $p_picHeight, $p_fileType, $p_fileName, $p_data, $psyNewDB){
                      //Alle Werte werden übergeben, psyNewDB enthält die Datenbankinitialisierung
                      //Einzeldaten schreiben in DB
                    
                      $p_data_set =  "abc123";
                      $sql  = "REPLACE INTO psy_pic_cache_copy ";
                      $sql .= "(`session`, token, `key`, pic_index, part_id, parts_all, num_all, `start`, `end`, width, height, file_type, file_name, file_data) ";
                      $sql .= "VALUES ";
                      $sql .= "('{$p_psySession}', '{$p_psyToken}', '{$p_psyKey}', {$p_picIndex}, {$current_part_id}, {$amount_of_parts}, {$p_numOfSlices}, {$p_start}, {$p_end}, {$p_picWidth}, {$p_picHeight}, '{$p_fileType}', '{$p_fileName}', ?)";
                      //$result = $psyNewDB -> DBquery($sql, 0, 0, 0, 0, 0, 0);
                      $result = $psyNewDB -> psySendLongData($sql, 12, $p_data_set);
                    
                      }
                    Es funktioniert soweit, das alle Werte außer $p_data_set in die Tabelle geschrieben werden. Für $p_data_set steht im sql String das Fragezeichen. $p_data_set wird extra an die Methode übergeben, damit dieses Datenpaket per mysqli_stmt_send_long_data geschrieben werden kann, an Stelle vom ? Zumindest sollte es aus meiner Sicht so sein.
                    Aber in der DB steht am Ende alles außer eben besagte $p_data_set (da steht NULL) und dabei habe ich zum Test nur einen kurzen String genommen. Es funktioniert weder bei Datentype Longlob noch bei Datentyp Longtext.
                    Was mache ich nun noch falsch?
                    http://download.psygonis.de/15-09-_2021_10-23-04.jpg

                    Kommentar


                    • #11
                      Zitat von psygonis
                      Einen Link senden, aus dem Manual kann jeder 6. Klässler
                      Und jeder sollte auch in der Lage sein, Links anzuklicken und den dortigen Inhalt lesen und verstehen zu können.
                      Warum soll jemand alles nochmal erklären, was vermutlich hinreichend in der Doku erklärt wurde?

                      Fahrt jetzt bitte die Gemüter wieder runter, sonst muss ich hier dicht machen.

                      Danke!
                      Competence-Center -> Enjoy the Informatrix
                      PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                      Kommentar


                      • #12
                        Wie kommst du bei mysqli_stmt_send_long_data() auf die Zahl 12? Du hast ja nur einen Parameter im SQL-Code.

                        Dein Mischmasch aus prozeduraler und objektorientierer Schreibweise kann einen auch ziemlich fertig machen. Du liebst wohl das Chaos. Und der ewig lange horizontale Code machts auch nicht besser. Kann man ständig hin und her scrollen. Auch wenn das dich nicht stört, wenn du Hilfe von anderen erwartest solltest du dich bitte etwas bemühen deinen Code vernünftig lesbar zu gestalten.

                        Kommentar


                        • #13
                          Zitat von Arne Drews Beitrag anzeigen
                          Und jeder sollte auch in der Lage sein, Links anzuklicken und den dortigen Inhalt lesen und verstehen zu können.
                          Warum soll jemand alles nochmal erklären, was vermutlich hinreichend in der Doku erklärt wurde?

                          Fahrt jetzt bitte die Gemüter wieder runter, sonst muss ich hier dicht machen.

                          Danke!
                          Wie Du schon sagst, "vermutlich". Es ist eben, zumindest für mich, nicht hinreichend erklärt. Genau aus diesem Grund funktioniert eben meine Umsetzung auch nicht. Nun kann das durchaus an meiner Unzulänglichkeit und Unwissenheit liegen, es kann aber auch andere Gründe haben. Was es aber auch immer ist, es sollte nicht als Grund dienen, die Hilfe zu verweigern. Wenn ich eben leider mit weniger Wissen gesegnet bin als ein hellbringer, dann sollte das eigentlich dazu führen, dass ein Unwissender wie ich, an dem allumfassenden Wissen eines hellbringer teilhaben darf. Zum Beispiel durch eine zusätzliche Erklärung zu dem Link. Er darf mir das sogar in Rechnung stellen. Aber sich in seinem Wissen zu sonnen und den anderen damit aufzeigen, wie blöd die doch eigentlich sind, sollte doch nicht der Ansatz dieses Forums sein, oder? Wo ist denn das Problem, einfach mal zu sagen, versuche es doch mal so oder so. Da dürfen auch kleine Codeschnipsel drin sein, es kann auch eine komplette Routine sein, die Zeile für Zeile erklärt ist. So würde ich das jedenfalls machen. Es darf aber auch ein finanzielles Angebot sein. Man kann über alles reden, aber die Vorgehensweise, hier hast Du einen Link und wenn Du das nicht begreifst bist Du für uns zu doof, dann geh lieber wieder weg, ist nicht der richtige Weg. Wozu denn sonst so ein Forum? Linklisten gibt`s genug im Netz. Ich habe hier auf Hilfe gehofft, die mein IT-Problem löst, nicht auf virtuelle Prügel. Wenn ich das will, gibt es andere Möglichkeiten.

                          Kommentar


                          • #14
                            Es steht alles im PHP-Handbuch. Was ist der Mehrwert davon, wenn ich alles per Copy+Paste wiederkaue? Beispielcode ist auch im Handbuch. Außerdem verwende ich persönlich kein mysqli, sondern seit 15+ Jahren nur mehr PDO. Also wenn, dann kann ich dir höchstens mein Beispielcode für PDO zur Verfügung stellen. Weil ich fang jetzt nich extra wegen dir an mich mit mysqli zu beschäftigen, mal davon abgesehen, dass ich mysqli mühsam finde. Auch bin ich nicht dein persönlicher Lehrer, sondern setze nur Anreize, anhand der du dich selber informieren kannst. Wenn dir das alles zu mühsam ist, dann hast du dir mit Programmieren wohl das falsche Hobby ausgesucht.

                            Du erwartest von anderen viel, lieferst selber aber eine sehr dürftige Leistung ab. Dafür schreibst du anscheinend sehr gerne lange Texte, in denen du dich über alles und jeden beklagst.

                            Kommentar


                            • #15
                              Zitat von hellbringer Beitrag anzeigen
                              Wie kommst du bei mysqli_stmt_send_long_data() auf die Zahl 12? Du hast ja nur einen Parameter im SQL-Code.

                              Dein Mischmasch aus prozeduraler und objektorientierer Schreibweise kann einen auch ziemlich fertig machen. Du liebst wohl das Chaos. Und der ewig lange horizontale Code machts auch nicht besser. Kann man ständig hin und her scrollen. Auch wenn das dich nicht stört, wenn du Hilfe von anderen erwartest solltest du dich bitte etwas bemühen deinen Code vernünftig lesbar zu gestalten.
                              So langsam kommen wir der Sache ja näher, auch wenn ich Deine Art immer noch unterirdisch finde. Die 12 kommt davon, das es bei mir der 12. Parameter in meinem sql Statement ist. Das man aber das Fragezeichen mehrfach einsetzen kann und dann das der "Parameter" ist dessen Zählung bei 0 beginnt, war mir nicht klar und genau das fand ich auch nicht hinreichend erklärt. Aber jetzt weiß ich das.
                              Wie Du aber auf die Idee kommst, ich würde da etwas mischen, verstehe ich immer noch nicht. Was nun den Code angeht, da hast Du wohl recht, hab ich aber so schlimm nicht gesehen, weil es ja nur 3 Zeilen waren., die es betrifft. Und Du hast ja auch alles sehen können. Jedenfalls funktioniert es jetzt mit dem "abc123". Nun muss es nur noch mit den großen Daten funktionieren.

                              Kommentar

                              Lädt...
                              X