header length

speedone

New Member
Hab ein kleines Problem

Ich habe dateien in einer Datenbank im Binär format unteranderem eine Spalte in dem ich die Größe in Bytes habe. Ich möchte jetzt mittels dem header für mein Downloadscript auch die größe dem Browser mitteilen.
Der download klappt ansich, aber die Größe des Files bleibt unbekannt.
Ich habe schon unzählige Foren durchsucht und viele Sachen ausprobiert vorallem mit der Syntax aber es nicht hinbekommen.
Die Sicherheitslüche mit der ID übergabe werde ich noch beheben ;)
Dies ist mein Versuch:


PHP:
<?php
 if (isset($_REQUEST['id'])){
  $id=$_REQUEST['id'];
  $db=mysql_connect("localhost","root","")
    or die ("Keine Verbindung zum Datenbankserver: ".mysql_error($db));
  mysql_query("USE hadabank")
    or die ("Keine Verbindung zum Datenbankserver: ".mysql_error($db));
  $anfrage="SELECT datei, dateiname FROM downloadarchiv_data WHERE id='".$id."'";
  $ergebnis=mysql_query($anfrage)
    or die ("Datenbankerror: ".mysql_error($db));
  if ($ergebnis) {
   $data = mysql_fetch_object($ergebnis);
   
   header("Content-Type: x-type/subtype");
   header("Content-Length: ($data->groesse)");
   header("Content-Disposition: attachment; filename=$data->dateiname");
   print ($data->datei);
  }
  mysql_close($db);
 }
?>
 
PHP:
header("Content-length: ".$data->groesse);
Lass die () um die Dateigröße (in Byte) weg.

BTW: Den Content-Type solltest du entweder sinnvoll belegen oder was generisches nehmen, wie z.B. application/octet-stream
 
Last edited by a moderator:
Nein das nicht.
Ich benutze Opera und bei allen anderen Sachen, die ich herunterlade zeigt er immer brav die Größe an... Noch bevor ich etwas herunterlade, kann ich ja sehen was für ein Typ der download ist da wird bei mir eben x-type/subtype angegeben und der Dateiname stimmt auch, nur die Größe wird hier nicht angezeigt.
 
Last edited by a moderator:
Hab ich gemacht
Internet Explorer sagt auch nichts.
Mit Firefox kann ich es leider nicht probieren. Lässt sich nicht mehr starten...

Aber ich denke, das es noch am code liegt. Kanns ja fast nur
 
Der Header sollte doch jetzt syntaktisch korrekt sein.
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html said:
14.13 Content-Length

The Content-Length entity-header field indicates the size of the entity-body, in decimal number of OCTETs, sent to the recipient or, in the case of the HEAD method, the size of the entity-body that would have been sent had the request been a GET.

Content-Length = "Content-Length" ":" 1*DIGIT

An example is

Content-Length: 3495

Applications SHOULD use this field to indicate the transfer-length of the message-body, unless this is prohibited by the rules in section 4.4.

Any Content-Length greater than or equal to zero is a valid value. Section 4.4 describes how to determine the length of a message-body if a Content-Length is not given.

Hast du gecheckt, ob im Header auch wirklich der richtige Wert steht?
 
Ich habe mal folgendes probiert:

PHP:
<?php
 if (isset($_REQUEST['id'])){
  $id=$_REQUEST['id'];
  $db=mysql_connect("localhost","root","")
    or die ("Keine Verbindung zum Datenbankserver: ".mysql_error($db));
  mysql_query("USE hadabank")
    or die ("Keine Verbindung zum Datenbankserver: ".mysql_error($db));
  $anfrage="SELECT datei, dateiname FROM downloadarchiv_data WHERE id='".$id."'";
  $ergebnis=mysql_query($anfrage)
    or die ("Datenbankerror: ".mysql_error($db));
  if ($ergebnis) {
   $data = mysql_fetch_object($ergebnis);
   
        
  
      
   echo $data->groesse;
  
  }
  mysql_close($db);
 }
?>

So sollte er ja eigentlich die Größe einfach mal hinschreiben, macht er aber nicht???
Ich habe eigentlich alles abgecheckt. Es ist ein Wert in der Datenbank.
Normal müsste er ja etwas ausgeben.
Vll habe ich noch etwas übersehen

OHHHHH na klar
Hab den Fehler gefunden:

$anfrage="SELECT datei, dateiname FROM downloadarchiv_data WHERE id='".$id."'";

Die Größe wird gar nicht selektiert... Macht die Müdigkeit^^

Danke für die Hilfe, es klappt jetzt
 
Last edited by a moderator:
Ja, willkommen im Land der SQL-Injections. Du möchtest folgendes machen:
PHP:
$id = (int)$_REQUEST['id'];
if (preg_match("/^[0-9]{1}[1-9]*$/",$id)) {
 ....
} else {
  echo "Böser Hackangriff!!!"
}
 
Du sprichst von Type-Cast und Regex Check?

Ich wollte lediglich zwei von vielen Möglichkeiten darstellen. Bissl blöde dargestellt.
 
Noch ein kleines Problem

Das funktioniert zwar einwandfrei im Opera, aber mit Firefox wird, wenn ich einen Dateinamen habe wie: "test hallo blaba.txt" nach "test" alles abgeschnitten und die Dateinamenerweiterung fehlt auch.
Sieht sehr danach aus, dass firefox keine leerzeichen mag oder`?


Ich hoffe ich habe somit die Sicherheitslücke geschlossen.
Code:
$id = (int)$_REQUEST['id'];
if (preg_match("/^[0-9]{1}[1-9]*$/",$id)) {

Mein download script:

PHP:
<?php
 if (isset($_REQUEST['id'])){
 	$id = (int)$_REQUEST['id'];
if (preg_match("/^[0-9]{1}[1-9]*$/",$id)) {
    $db=mysql_connect("localhost","root","")
    or die ("Keine Verbindung zum Datenbankserver: ".mysql_error($db));
  mysql_query("USE hadabank")
    or die ("Keine Verbindung zum Datenbankserver: ".mysql_error($db));
  $anfrage="SELECT datei, dateiname, groesse FROM downloadarchiv_data WHERE id='".$id."'";
  $ergebnis=mysql_query($anfrage)
    or die ("Datenbankerror: ".mysql_error($db));
  if ($ergebnis) {
   $data = mysql_fetch_object($ergebnis);
   
   $datei=$data->datei;
   $filename=$data->dateiname;
      
   header("Content-Type: x-type/subtype");
   header("Content-Length: ".$data->groesse);
   header("Content-Disposition: attachment; filename=$data->dateiname");
   print ($data->datei);
  }
  mysql_close($db);
 }}
?>

Wie kann man das Problem mit den Leerzeichen lösen?
 
Last edited by a moderator:
Code:
filename=[COLOR="DarkRed"]\"[/COLOR]$data->dateiname[COLOR="DarkRed"]\"[/COLOR]");
Ich denke da fehlen einfach nur Anführungszeichen. :)

huschi.
 
Ich habe jetzt

PHP:
$filename=$data->dateiname;

durch

PHP:
$filename=\"$data->dateiname\"");

ersetzt oder habe ich das falsch verstanden?

Es kommt aber jetzt der Fehler:

Code:
Warning: Unexpected character in input: '\' (ASCII=92) state=1 in /var/www/hadatenbank/download.php on line 16

Parse error: syntax error, unexpected ')' in /var/www/hadatenbank/download.php on line 16
 
Back
Top