PHP und MySQL: dateien in DB speichern?

Hallo!

Ich möchte für meine Seite alle Dateien (Bilder, HTML-Dateien) in eine MySQL Datenbank speichern, zwecks besserem Management.
Ich hab schon eine Tabelle angelegt, in der neben anderen Spalten auch „…,data blob,…“ für binäre Objekte ist. Leider ist es mir mittels PHP noch nicht gelungen, ein Bild dort hineinzuspeichern.
Weiss jemand wie das geht???

MFG, Volker

hi volker,

Ich möchte für meine Seite alle Dateien (Bilder, HTML-Dateien)
in eine MySQL Datenbank speichern, zwecks besserem Management.
Ich hab schon eine Tabelle angelegt, in der neben anderen
Spalten auch „…,data blob,…“ für binäre Objekte ist.
Leider ist es mir mittels PHP noch nicht gelungen, ein Bild
dort hineinzuspeichern.
Weiss jemand wie das geht???

wie hast du es denn bisher probiert?

MFG, Volker

gruss josh

Hallo,

wenn du das Bild als Datenstrom vorliegen hast, dann kannst du es einfach mittels

mysql_query(„INSERT INTO VALUES (’’)“);

einfügen. Es ist nur darauf zu achten, dass mysql ein Limit gesetzt hat von standardmäßig 1 MB pro Query. Wenn du keine Möglichkeit hast, diese Einstellungen zu ändern, dann kannst du es einfach umgehen, in dem du die Daten in mehrere „Chunks“ aufteilst und sie dann beim Auslesen wieder zusammen setzt (müsste eigentlich funktionieren).

Bye,
hebelt

Hallo!

Ich habs so gemacht:

$datafile = fopen(„image.jpg“,„r“); // etwa 3.5 KB groß
$imagefile = fread($datafile,10000);
fclose($datafile);

// images (filename varchar(20),data blob)

$wresult = mysql_query(„insert into images Values (‚image.jpg‘,’$imagefile’)“);

$rresult = mysql_query(„select data from images where filename = ‚image.jpg‘“);

$dbentry = mysql_fetch_row($rresult);

$filedata = $dbentry[0];
$wfile = fopen(„test.jpg“,„w“);
fwrite($wfile,$filedata);
fclose($wfile);

Leider ist die Datei „test.jpg“ nur 65 Bytes groß, die ersten 65 Bytes von „image.jpg“.

Was ist da falsch?

MFG, Volker

hi volker,

Hallo!

Ich habs so gemacht:

$datafile = fopen(„image.jpg“,„r“); // etwa 3.5 KB groß

kann es sein, dass du hier anstatt „r“ zusaetzlich noch das „b“ Flag fuer binary setzen solltest, also „rb“?

$imagefile = fread($datafile,10000);

schon mal nachgezaehlt wieviele daten hier angekommen sind?

hth josh

Hallo!

Ok, jetzt wurde einmal das gesamte Bild geladen.
Wenn ich jetzt mit

$wresult = mysql_query(„insert into images Values (‚image.jpg‘,’$imagefile’)“);

in die Datenbank schreiben will, bekomme ich immer einen Fehler
der Form

Query error (write): You have an error in your SQL syntax
near ‚()*456789 … ÂĂÄ‘ at line 1.

Kann es vielleicht damit zusammenhängen, dass im Datenstrom
ein „’“ ist? Genau an der Stelle wird der Fehler ausgelöst.
Wie kann ich dies verhindern?

MFG, Volker

hi volker,

Hallo!

Ok, jetzt wurde einmal das gesamte Bild geladen.
Wenn ich jetzt mit

super :smile:

$wresult = mysql_query(„insert into images Values
(‚image.jpg‘,’$imagefile’)“);

in die Datenbank schreiben will, bekomme ich immer einen
Fehler
der Form

Query error (write): You have an error in your SQL syntax
near ‚()*456789 … ÂĂÄ‘ at line 1.

Kann es vielleicht damit zusammenhängen, dass im Datenstrom
ein „’“ ist? Genau an der Stelle wird der Fehler ausgelöst.
Wie kann ich dies verhindern?

hm, jau. wuerde auch tippen dass es an den „’“ liegt. mal ‚"‘ oder besser (glaube ich) sind '' beim quoten des files. oder aber die "'" (im file) ersetzen mit "\'" (mei oh mei sieht des bloed aus :smile:). beim letzteren weiss ich allerdings nicht so genau ob das so toll ist, ich denke aber eher nicht. ich wuerde lieber mal probieren den file anstatt mit "'" lieber mit "" an sql zu uebergeben, sprich:

$wresult = mysql\_query("insert into images Values (`image.jpg`,`$imagefile`)");

MFG, Volker

hth josh

Hallo!

Leider geht das auch nicht mit den „`“. Da es sich um eine Binärdatei handelt werden immer alle Zeichen vorkommen, also auch alle Begrenzungszeichen.
Nun bin ich mit meinem Latein am Ende. Vielleicht finde ich igrendwann noch eine Lösung! Vielen Dank für deine Hilfe!

MFG, Volker

Hallo!

Ich möchte für meine Seite alle Dateien (Bilder, HTML-Dateien)
in eine MySQL Datenbank speichern, zwecks besserem Management.

Ich weiß nicht was das bringen soll. HTML-Dateien sind Text, dementsprechend sollte auch Text in der DB gespeichert werden. Es gibt keinen Grund, die html-Dateien als Binärdaten in der DB zu speichern, außer um alles unnötig komplizierter zu machen. Bilder sollten im Grunde auch im Dateisystem des Servers gespeichert werden, und in der DB nur ein Bezug darauf, z.B. der Dateiname. Binärdaten blasen die DB-Größe auf und bremsen das DBS unnötig. Wenn es trotzdem unbedingt sein muss, dass Bilder in der DB landen, sollten es zumindest nur kleine sein.

Ich hab schon eine Tabelle angelegt, in der neben anderen
Spalten auch „…,data blob,…“ für binäre Objekte ist.

Um ein JPG in der DB zu speichern empfiehlt sich MEDIUMBLOB (bis 2^24 Bytes ~ 16MB). Das klingt zwar unverschämt groß, aber BLOB ist zu klein (2^16 Bytes ~ 64KB).

Leider ist es mir mittels PHP noch nicht gelungen, ein Bild
dort hineinzuspeichern.
Weiss jemand wie das geht???

ja, so:

speichern als ‚dbimages.php‘:

<?php /* MySQL-Tabelle erstellen:<br />
 CREATE TABLE PICTURES (
 ID INT DEFAULT '0' NOT NULL AUTO\_INCREMENT,
 PICTURE MEDIUMBLOB,
 PRIMARY KEY (ID));
\*/
 //Mysql-Login 
 $dbhost = "localhost";
 $dbuser = "<benutzername>";<br>	$dbpwd = "";<br>	$dbname = "";<br> <br> $conn = mysql_connect($dbhost, $dbuser, $dbpwd);<br> if (!$conn) {<br> die("Konnte keine Verbindung zur DB herstellen.");<br>	}<br>	mysql_select_db($dbname);<br> if (isset($_GET["id"])) {<br> //Bilddatei aus DB anzeigen<br> $result = mysql_query("SELECT PICTURE FROM PICTURES WHERE ID=" . $_GET["id"]);<br> if (mysql_num_rows($result) &gt; 0) {<br> list($picture) = mysql_fetch_row($result);<br> }<br> header("Content-Type: image/jpeg");<br> print($picture);<br>	} else {<br> if (isset($_POST["upload"])) {<br> //Bilddatei uploaden<br> $image = @imagecreatefromjpeg($_FILES['picture']['tmp_name']); //Bilddatei aus temporärer Datei erstellen<br> ob_start(); // Ausgabepufferung einschalten<br> imagejpeg($image); // JPG an Ausgabepuffer senden<br> $jpg = ob_get_contents(); // JPG aus Puffer in Variable lesen<br> ob_end_clean(); // Ausgabepufferung ausschalten / Puffer leeren<br> $jpg = mysql_real_escape_string($jpg);<br> $jpg = str_replace('##', '\#\#', $jpg); //Daten für MySQL formatieren<br> mysql_query("INSERT INTO PICTURES (PICTURE) VALUES ('$jpg')"); //Daten als MEDIUMBLOB speichern<br>	} <br>?&gt;<br> <br> <br> Bild uploaden<br> $results = mysql_query("SELECT ID FROM PICTURES");<br> while (list($id) = mysql_fetch_row($results)) { <br> ?&gt;<br> <br><?php }<br /> ?&gt; <br> JPG-Bilddatei uploaden: <br> <br>	<br><?php }<br />	mysql_close($conn);<br>?&gt;</benutzername>

Gruß,
Rudy

Vielen Dank!

Werds gleich mal ausprobieren!

MFG, Volker