Binärdatenmit MySQL/PHP
am 27.06.2005 08:49:25 von Wolfgang Hartter
Hallo,
ich bin relativer Anfänger in Sachen MySQL und PHP und habe Probleme beim
Speichern/Auslesen/Anzeigen/(Download) von Binärdaten in einer
MySQL-Tabelle.
Konkret: die Binärdaten (jpg, doc) werden im Quelltext ausgegeben.
Was ich möchte:
- Benutzer wählt z.B. eine Word-Datei, die in einem blob-Feld in einer
Tabelle gespeichert wird.
- Bei der Ausgabe soll ein Link zum Download erscheinen.
Was ich mache:
a) Die Daten werden folgendermaßen gespeichert:
$data = addslashes(fread(fopen($form_data, "rb"), filesize($form_data)));
($data = mysql_escape_string(fread(fopen($form_data, "rb"),
filesize($form_data))); bringt ein identisches Ergebnis)
b) Einlesen der Daten über ein php-Script
$fileType = @mysql_result($result, 0, "filetype");
$fileContent = @mysql_result($result, 0, "bin_data");
c) Header setzen
header("Content-type: $fileType");
echo $fileContent;
Was passiert:
Fehlermeldung, dass der Header schon übertragen ist.
Dies soll ja als allererstes geschehen, es soll kein anderer Code davor
stehen - es sieht aber so aus, dass bereits mit
wurde. Der Grund scheint darin zu liegen, dass das aufrufende Script dies
schon gemacht hat.
Als Workaround versuchte ich, ein eigenes Script aufzurufen
include('show_msword.php');
echo show_msword($fileContent);
In diesem Script erzeuge ich den gesamten html-Code samt Header-Daten (ich
weiss - es sei übel html-Code in einem php-Script zu erzeugen, weiss aber
keinen Ausweg...).
Nun ist zwar die Fehlermeldung verschwunden, es erscheint aber immer noch
der Word-Quelltext (dies auch bei jpg-Dateien, nicht aber bei plain text).
Der Versuch, die Datenausgabe in einer html-Datei zu machen, in der der
Header schon richtig gesetzt ist klappt leider auch nicht.
Bei allen Scripten und Tutorials, die ich ausprobiert habe (schon 2 Tage
lang...) ist dies so der Fall - entweder der Header-Fehler oder Quelltext.
Ich habe u.a. ausprobiert:
http://www.devarticles.com/c/a/MySQL/Blobbing-Data-With-PHP- and-MySQL/5/
http://www.webmaster-resource.de/tricks/php/dateien-mit-php- hochladen.php
http://www.webmaster-resource.de/tutorials/php/binaerdaten-i n-einer-mysql-tabelle-speichern.php
Ich bin auf mysql und php angewiesen, kann beim Provider nicht ins
Filesystem schreiben. PHP läuft dort im "protected mode".
phpinfo() sagt, MySQL-File-upload ist möglich.
Irgend etwas scheine ich grundlegend falsch zu machen.
Aber was? Kann mir jemand auf die Sprünge helfen?
--
Mit freundlichen Grüßen
Wolfgang Hartter
Re: Binärdaten mit MySQL/PHP
am 27.06.2005 09:20:56 von do.not.REMOVETHAT
Wolfgang Hartter schrieb:
> Fehlermeldung, dass der Header schon übertragen ist.
Es darf über diese http-Verbindung kein einziges Byte vor dem Header
übertragen werden.
> In diesem Script erzeuge ich den gesamten html-Code samt Header-Daten
Was für ein HTML-Code? Ich denke es geht um Word-Dokuemnte sund so....
> Der Versuch, die Datenausgabe in einer html-Datei zu machen
....muss scheitern weil Du nicht HTML und Word gleichzeitig übertragen
kannst.
> Irgend etwas scheine ich grundlegend falsch zu machen.
> Aber was?
Du scheinst zu versuchen, die Datei auf einer HTML-Seite auszugeben. Das
geht nicht. Du solltest nur die Datei ausgeben und die Datei ausgeben.
Sonst *nichts*. Kein
echo "
und jetzt kommt die Datei:
";
davor machen oder so. Nur header und Datei. Sonst kein einziges Byte.
Das ist nicht übertrieben. Wirklich kein einziges Byte darf sonst
rüberkommen. Ein Leerzeichen oder "Enter" vor dem "
auch nach dem "?>" sollte kein "Enter" und kein Leerzeichen kommen....
Grüße, Matthias
--
"Hurd will be out in a year"
(Linus Benedict Torvalds, 5. Oktober 1991)
http://groups-beta.google.com/group/comp.os.minix/msg/2194d2 53268b0a1b
Re: Binärdaten mit MySQL/PHP
am 27.06.2005 09:21:11 von Fabian Schladitz
Wolfgang Hartter schrieb:
> ich bin relativer Anfänger in Sachen MySQL und PHP und habe Probleme =
beim
> Speichern/Auslesen/Anzeigen/(Download) von Binärdaten in einer
> MySQL-Tabelle.
16.3. Ist es sinnvoll, Bilder in einer Datenbank abzulegen?
http://www.php-faq.de/q/q-db-blob.html
Gilt auch für andere Dateitypen.
> Konkret: die Binärdaten (jpg, doc) werden im Quelltext ausgegeben.
Dann stimmt der Header nicht.
> c) Header setzen
> header("Content-type: $fileType");
> echo $fileContent;
Was steht in $fileType drin?
>=20
> Was passiert:
> Fehlermeldung, dass der Header schon übertragen ist.
> Dies soll ja als allererstes geschehen, es soll kein anderer Code davor=
> stehen - es sieht aber so aus, dass bereits mit
ckt
> wurde. Der Grund scheint darin zu liegen, dass das aufrufende Script di=
es
> schon gemacht hat.=20
Ja... also:
Die Ausgabe deiner Binärdaten solltest du in ein eigenes Skript packen,=
=20
welches durch einen Link aufgerufen wird. Dieses Skript tut NICHTS=20
anderes als die Datei und die Headers ausgeben.
Die darfst du nicht inkludieren oder sowas.
> Als Workaround versuchte ich, ein eigenes Script aufzurufen
> include('show_msword.php');
> echo show_msword($fileContent);
> In diesem Script erzeuge ich den gesamten html-Code samt Header-Daten (=
ich
> weiss - es sei übel html-Code in einem php-Script zu erzeugen, weiss =
aber
> keinen Ausweg...).
Bei Ausgabe einer Datei verlangt, dass vorher KEIN HTML ausgeben wurde.=20
Auch sonst nichts.
> Nun ist zwar die Fehlermeldung verschwunden, es erscheint aber immer no=
ch
> der Word-Quelltext (dies auch bei jpg-Dateien, nicht aber bei plain tex=
t).
Was erscheint denn bei plain text? O_o
Und wie schon gefragt: welchen Header setzt du denn?
> Der Versuch, die Datenausgabe in einer html-Datei zu machen, in der der=
> Header schon richtig gesetzt ist klappt leider auch nicht.
Wie setzt du in einer HTML-Datei den Header? Header werden _vor_ dem=20
HTML gesendet. Und wie schon gesagt: entweder HTML *oder* Datei.
> Ich bin auf mysql und php angewiesen, kann beim Provider nicht ins
> Filesystem schreiben. PHP läuft dort im "protected mode".
> phpinfo() sagt, MySQL-File-upload ist möglich.
Dann ruf die mal an, dass dies geändert werden sollten, da du sonst=20
anfängst einige MB in ihre Datenbank zu laden.
> Irgend etwas scheine ich grundlegend falsch zu machen.
> Aber was? Kann mir jemand auf die Sprünge helfen?
Eine Seite bauen, welche die Dateien auflistet und jeweils einen Link zu =
einem zweiten PHP-Skript enthält.
Das zweite Skript macht nur:
header();
echo $Dateiinhalt;
--=20
HTH,
Fabian
Re: Binärdatenmit MySQL/PHP
am 29.06.2005 20:22:36 von Wolfgang Hartter
Fabian Schladitz wrote:
> Wolfgang Hartter schrieb:
>> ich bin relativer Anfänger in Sachen MySQL und PHP und habe Probleme beim
>> Speichern/Auslesen/Anzeigen/(Download) von Binärdaten in einer
>> MySQL-Tabelle.
Danke allerseits für die ausführliche Hilfe.
Ich bekomme es trotzdem nicht hin, obwohl ich alle Vorschläge in
verschiedenen Varianten ausprobiert habe.
Der Versuch war's wert.
Als Lösung habe ich jetzt doch das Speichern außerhalb der Datenbank
gewählt, was bestimmt auch nicht ganz der falsche Weg ist.
Von der Verwaltung ist es jetzt halt etwas aufwändiger, aber sicher auch
performanter.
--
Mit freundlichen Grüßen
Wolfgang Hartter