Problem mit File Download

Problem mit File Download

am 18.02.2005 23:46:32 von newbie

Als Anfänger hätte ich folgende Frage:

Habe in einer Tabelle in einem BLOB verschiedene Dateitypen wie: pdf,
word.doc bzw. zip. Wenn ich mit folgendem Script die Dateien aus der
Datenbank herunterlade, funktioniert das nur mit pdf Dateien, Word Dateien
sehen anders aus als das Original und zip files lassen sich nicht öffnen.
Vielen Dank für einen Hinweis. Hier der Code:


$id_files=$_GET['id'];

if (isset($id_files)) {


$conn = mysql_connect("host", "user", "password");

mysql_select_db("db", $conn) or die(mysql_errno() . ": " . mysql_error() .
"
");



$sql = "SELECT bin_data, filetype, filename, filesize FROM tbl_files WHERE
id_files=$id_files";

$result = @mysql_query($sql, $conn);


while($row=mysql_fetch_object($result))

{

$data = $row->bin_data;

$name = $row->filename;

$size = $row->filesize;

$type = $row->filetype;

}



header("Content-Type: ".$type);

$header="Content-Disposition: attachment; filename=".$name;

header($header );

header("Content-Length: ".$size);

echo $data;


}

?>

Re: Problem mit File Download

am 19.02.2005 00:06:22 von Niels Braczek

Newbie schrieb:
^^^^^^
Trage bitte deinen Namen als Absender ein.

> Habe in einer Tabelle in einem BLOB verschiedene Dateitypen wie: pdf,
> word.doc bzw. zip. Wenn ich mit folgendem Script die Dateien aus der
> Datenbank herunterlade, funktioniert das nur mit pdf Dateien, Word Dateien
> sehen anders aus als das Original und zip files lassen sich nicht öffnen.

Das sit einer der Gründe, warum man die Dateien im normalen Dateisystem
belässt und nur Referenzen in die Datenbank aufnimmt.
Offensichtlich hast du einen Datentyp gewählt, der nicht binary safe ist
und/oder beim Einstellen in die Datenbank nicht richtig maskiert.
magic_quotes_runtime könnte dir evtl. auch noch dazwischen funken, da
bin ich aber nicht sicher.

MfG
Niels

Re: Problem mit File Download

am 19.02.2005 10:05:46 von unknown

Hallo,

posten Sie mal die Tabellen definition.
Der Fehler liegt sicherlich am Datentyp.

Grundsätzlich spricht nichts gehen die vorgehensweise bin-Data in einer
DB zu speichern.
Aber das ist eben eine Glaubensfrage. Und über Glauben kann nicht
streiten. :-)

Hinweis:

Sie sollten mal Ihrer Anzeigenamen ändern, es gibt Leute in der NG die
sich daran stören.


--
Best regards / Mit freundlichen Gruessen

Joachim Misselbeck

Zitat:
Die analytische Maschine (der Computer) kann nur das ausführen, was wir
zu programmieren imstande sind. (Ada Lovelace)

Re: Problem mit File Download

am 19.02.2005 13:49:36 von Sebastian Vogel

> posten Sie mal die Tabellen definition.
> Der Fehler liegt sicherlich am Datentyp.
>
CREATE TABLE `tbl_files` (
`id_files` tinyint(3) unsigned NOT NULL auto_increment,
`bin_data` longblob NOT NULL,
`description` tinytext NOT NULL,
`filename` varchar(50) NOT NULL default '',
`filesize` varchar(50) NOT NULL default '',
`filetype` varchar(50) NOT NULL default '',
PRIMARY KEY (`id_files`)
) TYPE=MyISAM AUTO_INCREMENT=51 ;

Vielen Dank...

Sebastian

Re: Problem mit File Download

am 19.02.2005 21:35:37 von Matthias Esken

Sebastian Vogel schrieb:

> CREATE TABLE `tbl_files` (
> `id_files` tinyint(3) unsigned NOT NULL auto_increment,
> `bin_data` longblob NOT NULL,
> `description` tinytext NOT NULL,
> `filename` varchar(50) NOT NULL default '',
> `filesize` varchar(50) NOT NULL default '',
> `filetype` varchar(50) NOT NULL default '',
> PRIMARY KEY (`id_files`)
> ) TYPE=MyISAM AUTO_INCREMENT=51 ;

Und jetzt wäre es noch nett, die Frage zu haben. Das Originalposting
liegt mir nicht vor und der bisher Antwortende hat leider ein Nullquote
abgeliefert.

Gruß,
Matthias

Re: Problem mit File Download

am 20.02.2005 00:04:10 von Thomas Hamacher

Matthias Esken schrieb:
> Sebastian Vogel schrieb:

>>CREATE TABLE `tbl_files` (
>> `id_files` tinyint(3) unsigned NOT NULL auto_increment,
>> `bin_data` longblob NOT NULL,
>> `description` tinytext NOT NULL,
>> `filename` varchar(50) NOT NULL default '',
>> `filesize` varchar(50) NOT NULL default '',
>> `filetype` varchar(50) NOT NULL default '',
>> PRIMARY KEY (`id_files`)
>>) TYPE=MyISAM AUTO_INCREMENT=51 ;

> Und jetzt wäre es noch nett, die Frage zu haben. Das Originalposting
> liegt mir nicht vor und der bisher Antwortende hat leider ein Nullquote
> abgeliefert.

Re: Problem mit File Download

am 20.02.2005 02:21:28 von Dennis Birkholz

Newbie schrieb:
> Als Anfänger hätte ich folgende Frage:
>
> Habe in einer Tabelle in einem BLOB verschiedene Dateitypen wie: pdf,
> word.doc bzw. zip. Wenn ich mit folgendem Script die Dateien aus der
> Datenbank herunterlade, funktioniert das nur mit pdf Dateien, Word Dateien
> sehen anders aus als das Original und zip files lassen sich nicht öffnen.
> Vielen Dank für einen Hinweis. Hier der Code:
>
> >
> $id_files=$_GET['id'];
>
> if (isset($id_files)) {
>
>
> $conn = mysql_connect("host", "user", "password");
>
> mysql_select_db("db", $conn) or die(mysql_errno() . ": " . mysql_error() .
> "
");
>
>
>
> $sql = "SELECT bin_data, filetype, filename, filesize FROM tbl_files WHERE
> id_files=$id_files";
>
> $result = @mysql_query($sql, $conn);
>
>
> while($row=mysql_fetch_object($result))
>
> {
>
> $data = $row->bin_data;
>
> $name = $row->filename;
>
> $size = $row->filesize;
>
> $type = $row->filetype;
>
> }
>
>
>
> header("Content-Type: ".$type);
>
> $header="Content-Disposition: attachment; filename=".$name;
>
> header($header );
>
> header("Content-Length: ".$size);
>
> echo $data;
>
>
> }
>
> ?>
>


Hallo,

ich würde folgendes Versuchen:
magic_quotes_runtime ausschalten und dann die Datei mit
mysql_escape_string() beim einfügen quoten, da es sein kann, dass per
Magic_quotes_runtime Zeichen falsch behandelt werden.

Die andere Möglichkeit wäre, die Datei mit base64_encode in einen Text
zu verwandeln und abzuspeichern, dann ist das Escape-Problem nicht mehr da.

Hast du die Dateien nach dem Download mal verglichen (z.B. einen
MD5-Hash gemacht??) Vielleicht sind auch nur die Zeilenumbrüche kaputt
gegangen, dass kann auch mal passieren.

Und die Dateien müssen Binary-Safe eingelesen werden.
Unter PHP5 oder >4.3 würde ich file_get_contents() benutzen, ansonsten
musst du auf jeden Fall fread() und nicht fgets() benutzen.

Viele Grüße,
Dennis

Re: Problem mit File Download

am 20.02.2005 15:00:52 von Sebastian Vogel

"Dennis Birkholz" schrieb im Newsbeitrag
news:37q716F5gdhr5U1@news.dfncis.de...
> Newbie schrieb:
> > Als Anfänger hätte ich folgende Frage:
> >
> > Habe in einer Tabelle in einem BLOB verschiedene Dateitypen wie: pdf,
> > word.doc bzw. zip. Wenn ich mit folgendem Script die Dateien aus der
> > Datenbank herunterlade, funktioniert das nur mit pdf Dateien, Word
Dateien
> > sehen anders aus als das Original und zip files lassen sich nicht
öffnen.
> > Vielen Dank für einen Hinweis. Hier der Code:
> >
> > > >
> > $id_files=$_GET['id'];
> >
> > if (isset($id_files)) {
> >
> >
> > $conn = mysql_connect("host", "user", "password");
> >
> > mysql_select_db("db", $conn) or die(mysql_errno() . ": " . mysql_error()
..
> > "
");
> >
> >
> >
> > $sql = "SELECT bin_data, filetype, filename, filesize FROM tbl_files
WHERE
> > id_files=$id_files";
> >
> > $result = @mysql_query($sql, $conn);
> >
> >
> > while($row=mysql_fetch_object($result))
> >
> > {
> >
> > $data = $row->bin_data;
> >
> > $name = $row->filename;
> >
> > $size = $row->filesize;
> >
> > $type = $row->filetype;
> >
> > }
> >
> >
> >
> > header("Content-Type: ".$type);
> >
> > $header="Content-Disposition: attachment; filename=".$name;
> >
> > header($header );
> >
> > header("Content-Length: ".$size);
> >
> > echo $data;
> >
> >
> > }
> >
> > ?>
> >
>
>
> Hallo,
>
> ich würde folgendes Versuchen:
> magic_quotes_runtime ausschalten und dann die Datei mit
ist alles ausgeschaltet...

> mysql_escape_string() beim einfügen quoten, da es sein kann, dass per
> Magic_quotes_runtime Zeichen falsch behandelt werden.
>
> Die andere Möglichkeit wäre, die Datei mit base64_encode in einen Text
> zu verwandeln und abzuspeichern, dann ist das Escape-Problem nicht mehr
da.
>
Das habe ich auch versucht, klappt aber leider auch nicht. Ich habe nochmal
das Upload script beigefügt, vielleicht ist da ja was falsch drin...

$upfile = $_FILES['binFile']['tmp_name'];

....

$data = addslashes(fread(fopen($upfile, "r"), filesize($upfile)));



Wie gesagt, mit pdf-Dateien laeuft das alles. Vielleicht hat ja noch jemand
einen Hinweis...

Re: Problem mit File Download

am 20.02.2005 15:55:52 von Carsten Wiedmann

"Sebastian Vogel" schrieb:

> $data = addslashes(fread(fopen($upfile, "r"), filesize($upfile)));

Welches OS hast du denn? Beim fopen solltest du zur Sicherheit "rb"
nehmen bei Binärdaten wie Worddocs usw. Oder nimmst gleich
file_get_contents() im den Inhalt in die Variable zu einzulesen.

Gruß
Carsten

Re: Problem mit File Download

am 20.02.2005 16:44:15 von Sebastian Vogel

>
> > $data = addslashes(fread(fopen($upfile, "r"), filesize($upfile)));
>
> Welches OS hast du denn? Beim fopen solltest du zur Sicherheit "rb"

OS= Win2k
fopen habe ich jetzt "rb". Ergebnis wie gehabt: pdf klappt ohne Problem
(upload und anschliessend korrekte Darstellung nach download.

mit file_get_contents($upfiel); klappt es leider gar nicht, oder habe ich da
was falsch verstanden. base64_encode und anschliessend _decode beim download
will auch nicht. Komisch, dass es aber mit pdf´s geht. Vielleicht hat ja
jemand auch schonmal so ne Konstellation gehabt (bin eben noch Einsteiger.)
trotzdem vielen Dank.

Sebastian

> nehmen bei Binärdaten wie Worddocs usw. Oder nimmst gleich
> file_get_contents() im den Inhalt in die Variable zu einzulesen.
>
> Gruß
> Carsten

Re: Problem mit File Download

am 20.02.2005 17:12:34 von Carsten Wiedmann

"Sebastian Vogel" schrieb:

> mit file_get_contents($upfiel); klappt es leider gar nicht, oder
> habe ich da was falsch verstanden. base64_encode und anschliessend

| $data = file_get_contents($_FILES['foo']['tmp_name']);
| $data = mysql_real_escape_string($data);

BTW:
Würde sich denn die Datei in Word öffnen lassen, wenn du sie nach dem
Auslesen aus der DB einfach auf die Platte speicherst anstatt zum
Browser zu schicken (echo)?

Gruß
Carsten

Re: Problem mit File Download

am 20.02.2005 19:24:20 von Dennis Birkholz

Sebastian Vogel schrieb:
>>>$data = addslashes(fread(fopen($upfile, "r"), filesize($upfile)));
>>
>>Welches OS hast du denn? Beim fopen solltest du zur Sicherheit "rb"
>
>
> OS= Win2k
> fopen habe ich jetzt "rb". Ergebnis wie gehabt: pdf klappt ohne Problem
> (upload und anschliessend korrekte Darstellung nach download.
>
> mit file_get_contents($upfiel); klappt es leider gar nicht, oder habe ich da
> was falsch verstanden. base64_encode und anschliessend _decode beim download
> will auch nicht. Komisch, dass es aber mit pdf´s geht. Vielleicht hat ja
> jemand auch schonmal so ne Konstellation gehabt (bin eben noch Einsteiger.)
> trotzdem vielen Dank.
>
> Sebastian
>
>
>>nehmen bei Binärdaten wie Worddocs usw. Oder nimmst gleich
>>file_get_contents() im den Inhalt in die Variable zu einzulesen.
>>
>>Gruß
>>Carsten
>
>
>
Hallo Carsten,

du solltest beim einlesen KEIN addslashes verwenden, sondern
mysql_escape_string() oder mysql_real_escape_string().

Kannst du vielleich mal das ganze Script posten und mal sagen, ob du
magic_quotes_runtime an hast??

Viele Grüße,
Dennis

Re: Problem mit File Download

am 20.02.2005 21:27:16 von Sebastian Vogel

> du solltest beim einlesen KEIN addslashes verwenden, sondern
> mysql_escape_string() oder mysql_real_escape_string().
>
Ok, vielen Dank, jetzt laeuft es...

Sebastian