{"id":587,"date":"2019-10-06T15:43:35","date_gmt":"2019-10-06T13:43:35","guid":{"rendered":"https:\/\/ekiwi.de\/?p=587"},"modified":"2019-10-06T15:43:35","modified_gmt":"2019-10-06T13:43:35","slug":"php-dateiupload-als-blob-feld-in-mysql-speichern","status":"publish","type":"post","link":"https:\/\/ekiwi.de\/index.php\/587\/php-dateiupload-als-blob-feld-in-mysql-speichern\/","title":{"rendered":"PHP &#8211; Dateiupload als Blob Feld in MySQL speichern"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Inhalt<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/ekiwi.de\/index.php\/587\/php-dateiupload-als-blob-feld-in-mysql-speichern\/#Das_Uploadformular\" >Das Uploadformular<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/ekiwi.de\/index.php\/587\/php-dateiupload-als-blob-feld-in-mysql-speichern\/#Die_Datenbank\" >Die Datenbank<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/ekiwi.de\/index.php\/587\/php-dateiupload-als-blob-feld-in-mysql-speichern\/#PHP-Code_fuer_den_Upload\" >PHP-Code f\u00fcr den Upload<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/ekiwi.de\/index.php\/587\/php-dateiupload-als-blob-feld-in-mysql-speichern\/#Ausgabe_des_Bildes_ueber_PHP\" >Ausgabe des Bildes \u00fcber PHP<\/a><\/li><\/ul><\/nav><\/div>\n<p>In diesem Tutorial schauen wir uns an, wie wir ein Dateiupload Feld in einer MySQL-Datenbank abspeichern k\u00f6nnen. Ein Bild soll in einem Blob-Feld gesichert werden und bei Bedarf wieder ausgelesen und angezeigt werden.<\/p>\n<p><!--more--><\/p>\n<p>Das gesamte Beispielscript gibt es am Ende zum Download. Grunds\u00e4tzlich kann man argumentieren, ob Bin\u00e4rdaten \u00fcberhaupt in eine Datenbank gespeichert werden sollten. Eine weitere Vorgehensweise w\u00e4re, die Dateien einfach im Dateisystem abzulegen und nur den Verweis in die Datenbank zu packen. <\/p>\n<h2><span class=\"ez-toc-section\" id=\"Das_Uploadformular\"><\/span>Das Uploadformular<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Im ersten Schritt schauen wir uns das Uploadformular (erstellt mit dem <a href=\"https:\/\/da-software.de\/software\/da-formmaker\/\" target=\"_blank\" rel=\"noopener noreferrer\">DA-FormMaker<\/a>) an:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"\/wp-content\/uploads\/2019\/10\/blob_1.png\" alt=\"\" width=\"429\" height=\"334\" class=\"aligncenter size-full wp-image-589\" srcset=\"\/wp-content\/uploads\/2019\/10\/blob_1.png 429w, \/wp-content\/uploads\/2019\/10\/blob_1-300x234.png 300w\" sizes=\"auto, (max-width: 429px) 100vw, 429px\" \/><\/p>\n<p>Ein einfaches Formular f\u00fcr den Upload von einer Datei. <\/p>\n<h2><span class=\"ez-toc-section\" id=\"Die_Datenbank\"><\/span>Die Datenbank<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Zur Speicherung in der Datenbank legen wir folgende Tabelle an:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"\/wp-content\/uploads\/2019\/10\/blob_2.png\" alt=\"\" width=\"772\" height=\"87\" class=\"aligncenter size-full wp-image-590\" srcset=\"\/wp-content\/uploads\/2019\/10\/blob_2.png 772w, \/wp-content\/uploads\/2019\/10\/blob_2-300x34.png 300w, \/wp-content\/uploads\/2019\/10\/blob_2-768x87.png 768w\" sizes=\"auto, (max-width: 772px) 100vw, 772px\" \/><\/p>\n<p>Auch diese ist recht einfach gehalten und besteht nur aus einer ID und dem Blob-Feld f\u00fcr die Bilddaten.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"PHP-Code_fuer_den_Upload\"><\/span>PHP-Code f\u00fcr den Upload<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Das Formular verarbeiten wir mit einem PHP-Script:<\/p>\n<pre>if (!empty($_FILES['upload']['name']))\r\n{\r\n  $localFileName = 'uploads\/' . $_FILES['upload']['name'];\r\n  if (move_uploaded_file($_FILES['upload']['tmp_name'], $localFileName))\r\n  {\r\n    \/\/Datei einlesen\r\n    $content = file_get_contents($localFileName);\r\n\r\n    \/\/Verbindung zur MySQL-Datenbank\r\n    $conn = new mysqli(&quot;localhost&quot;, &quot;root&quot;, &quot;&quot;, &quot;test&quot;);\r\n\r\n    \/\/Verbindung \u00fcberpr\u00fcfen\r\n    if ($conn-&gt;connect_error) \r\n    {\r\n      die(&quot;Verbindung fehlgeschlagen: &quot; . $conn-&gt;connect_error);\r\n    }\r\n    \r\n    $sql = &quot;INSERT INTO fileupload (image) VALUES (0x&quot; .  bin2hex($content) . &quot;)&quot;;\r\n    \r\n    \/\/Einf\u00fcgen in Datenbank\r\n    if ($conn-&gt;query($sql) === TRUE) \r\n    {\r\n      echo &quot;Bild angelegt ID = &quot; . $conn-&gt;insert_id;      \r\n    } else \r\n    {\r\n      echo &quot;Fehler: &quot; . $sql . &quot;&lt;br&gt;&quot; . $conn-&gt;error;\r\n      die();\r\n    }\r\n\r\n\tunlink($localFileName);\r\n    $conn-&gt;close();\r\n  }\r\n} else \r\n{\r\n  echo '&lt;b&gt;kein Upload!&lt;\/b&gt;';\r\n}<\/pre>\n<p>Was passiert hier? Zuerst schauen wir, ob eine Datei hochgeladen worden ist. Anschlie\u00dfend wird die Datei in den Unterordner &#8222;uploads&#8220; verschoben. Anschlie\u00dfend lesen wir die Datei in eine Variable ein.<\/p>\n<p>Nun bauen wir die Verbindung zur MySQL-Datenbank auf und f\u00fcgen die Bilddaten in die Datenbank ein. Die Bin\u00e4rdaten des Bildes wandeln wir vorher mit der Funktion &#8222;<a href=\"https:\/\/www.php.net\/manual\/en\/function.bin2hex.php\" target=\"_blank\" rel=\"noopener noreferrer\">bin2hex<\/a>&#8220; vom bin\u00e4ren Format in ein hexadezimales Format um. <\/p>\n<p>Anschlie\u00dfend geben wir die ID des neuen Eintrags aus. In phpMyAdmin k\u00f6nnen wir nach dem Upload die Daten sehen:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"\/wp-content\/uploads\/2019\/10\/blob_3.jpg\" alt=\"\" width=\"371\" height=\"96\" class=\"aligncenter size-full wp-image-591\" srcset=\"\/wp-content\/uploads\/2019\/10\/blob_3.jpg 371w, \/wp-content\/uploads\/2019\/10\/blob_3-300x78.jpg 300w\" sizes=\"auto, (max-width: 371px) 100vw, 371px\" \/><\/p>\n<h2><span class=\"ez-toc-section\" id=\"Ausgabe_des_Bildes_ueber_PHP\"><\/span>Ausgabe des Bildes \u00fcber PHP<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Nat\u00fcrlich wollen wir auch wieder in die Daten herankommen. Dazu ein einfaches Beispiel, welches das Bild einfach im Browser ausgibt.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"\/wp-content\/uploads\/2019\/10\/blob_4.jpg\" alt=\"\" width=\"639\" height=\"482\" class=\"aligncenter size-full wp-image-592\" srcset=\"\/wp-content\/uploads\/2019\/10\/blob_4.jpg 639w, \/wp-content\/uploads\/2019\/10\/blob_4-300x226.jpg 300w\" sizes=\"auto, (max-width: 639px) 100vw, 639px\" \/><\/p>\n<p>Der Code:<\/p>\n<pre>if (!isset($_GET[&quot;id&quot;])) die(&quot;... keine ID angegeben.&quot;);\r\n\r\n$id = $_GET[&quot;id&quot;];\r\n\/\/Verbindung zur MySQL-Datenbank\r\n$conn = new mysqli(&quot;localhost&quot;, &quot;root&quot;, &quot;&quot;, &quot;test&quot;);\r\n\r\n\/\/Verbindung \u00fcberpr\u00fcfen\r\nif ($conn-&gt;connect_error) \r\n{\r\n  die(&quot;Verbindung fehlgeschlagen: &quot; . $conn-&gt;connect_error);\r\n}\r\n\r\n$sql = &quot;SELECT id, image from fileupload WHERE id = &quot; . $id;\r\n$result = $conn-&gt;query($sql);\r\n\r\nif ($result-&gt;num_rows &gt; 0) \r\n{\r\n    while($row = $result-&gt;fetch_assoc()) \r\n    {\r\n        $imgContent = $row[&quot;image&quot;];\r\n        $type = 'image\/jpeg';\r\n        header('Content-Type:'.$type);\r\n        $size = strlen($imgContent);\r\n        header('Content-Length: ' . $size);\r\n        echo $imgContent;\r\n    }\r\n}<\/pre>\n<p>Dem Script \u00fcbergeben wir die ID des Bildes. Sofern diese vorhanden ist, lesen wir die Zeile aus der Datenbank und geben das Bild dann aus. Wie wir hier sehen, muss es sich bei dem Bild um ein Jpeg-Bild handeln. <\/p>\n<p>Das Bild wird anschlie\u00dfend einfach ausgegeben.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2019\/10\/blob_upload.zip\">Download des Beispiels<\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>In diesem Tutorial schauen wir uns an, wie wir ein Dateiupload Feld in einer MySQL-Datenbank abspeichern k\u00f6nnen. Ein Bild soll<\/p>\n","protected":false},"author":1,"featured_media":588,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_links_to":"","_links_to_target":""},"categories":[14,13],"tags":[18,24,31],"class_list":["post-587","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-php","category-programmierung","tag-formular","tag-mysql","tag-php"],"_links":{"self":[{"href":"https:\/\/ekiwi.de\/index.php\/wp-json\/wp\/v2\/posts\/587","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ekiwi.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ekiwi.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ekiwi.de\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ekiwi.de\/index.php\/wp-json\/wp\/v2\/comments?post=587"}],"version-history":[{"count":0,"href":"https:\/\/ekiwi.de\/index.php\/wp-json\/wp\/v2\/posts\/587\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ekiwi.de\/index.php\/wp-json\/wp\/v2\/media\/588"}],"wp:attachment":[{"href":"https:\/\/ekiwi.de\/index.php\/wp-json\/wp\/v2\/media?parent=587"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ekiwi.de\/index.php\/wp-json\/wp\/v2\/categories?post=587"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ekiwi.de\/index.php\/wp-json\/wp\/v2\/tags?post=587"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}