spoeppi: Binärdaten in einer MySQL-Tabell speichern und ausgeben

Hallo Leute,
ich möchte eine Datei (z.B. WORD) in einer mysql Tabelle speichern. In die Tabelle bringe ich die Daten auch, nur kann ich sie nicht mehr auslesen.
Beim aufrufen erkenne ich zwar das es z.B ein Word Dokument bzw. ist auch der Name richtig, aber die Größe stimmt nicht bzw. kann sie auch nicht geöffnet werden.
Ich kann die Datei zwar speichern, dann stimmt auch der Name bzw. Typ aber die Größe ist immer 1KB und die Datei ist lehr.

// meine Tabelle

CREATE TABLE anhang (
id int(11) NOT NULL auto_increment,
dateiname varchar(225) collate latin1_general_ci NOT NULL default '',
dateigroesse int(11) NOT NULL default '0',
dateityp varchar(225) collate latin1_general_ci NOT NULL default '',
daten mediumblob NOT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=15 ;

// eingabe Befehl

PHP-Quellcode:

<?php
$data = addslashes(fread(fopen($_FILES['anhang']['tmp_name'], "r+"), $_FILES['anhang']['size']));

$query="INSERT INTO anhang (dateiname,dateigroesse,dateityp,daten) ".
         "VALUES ('".$_FILES['anhang']['name']."', '".$_FILES['anhang']['size']."', '".$_FILES['anhang']['type']."', '".$data."')";

$result=mysql_query($query);
?>

// eingabe zelle
<th> appendix:</th><td colspan="3"><input type="file" id="anhang" name="anhang" size="80"/> </td>

// ausgabe script

PHP-Quellcode:

<?php
$SQL = "SELECT dateiname, dateigroesse, dateityp, daten FROM anhang WHERE id=$id";
   $ResultPointer = mysql_query($SQL, $dbh);
   $Result=mysql_fetch_object($ResultPointer);

header("Content-type: ".$Result->dateityp);
   header("Content-length: ".$Result->dateigroesse);
   header("Content-Disposition: attachment; filename=".$Result->dateiname);
   echo $data->Daten;
?>

Natürlich habe ich zuerst alle anderen Beiträge zu dem Thema gelesen bin nur leider nicht schlau daraus geworden.
Ich hoffe ihr könnt mir dabei helfen.
Danke

  1. Moin!

    Ich kann die Datei zwar speichern, dann stimmt auch der Name bzw. Typ aber die Größe ist immer 1KB und die Datei ist lehr.

    $data = addslashes(fread(fopen($_FILES['anhang']['tmp_name'], "r+"), $_FILES['anhang']['size']));

    Auch für dich gilt: Schreiben in die Datenbank NUR mit mysql_real_escape_string(), NICHT mit addslashes()!!!

    addslashes maskiert weniger Bytes, von denen einige in Binärdatenströmen störend wirken, wenn sie nicht maskiert werden.

    $query="INSERT INTO anhang (dateiname,dateigroesse,dateityp,daten) ".
             "VALUES ('".$_FILES['anhang']['name']."', '".$_FILES['anhang']['size']."', '".$_FILES['anhang']['type']."', '".$data."')";

    Alle Angaben in $_FILES sind komplett vom User definierbar. Wenn du die nicht durch mysql_real_escape_string() jagst, bist du anfällig für Code Injection!

    - Sven Rautenberg

    --
    My sssignature, my preciousssss!
    1. Hallo Danke für die Info habe den Eingabeteil geändert.

      // neue eingabe
      $data = mysql_real_escape_string(fread(fopen($_FILES['anhang']['tmp_name'], "rb"), $_FILES['anhang']['size']));

      $dateiname = mysql_real_escape_string($_FILES['anhang']['name']);
      $dateigroesse = mysql_real_escape_string($_FILES['anhang']['size']);
      $dateityp = mysql_real_escape_string($_FILES['anhang']['type']);

      $query="INSERT INTO anhang (dateiname,dateigroesse,dateityp,daten) ".
      "VALUES ('".$dateiname."', '".$dateigroesse."', '".$dateityp."', '".$data."')";

      $result=mysql_query($query);

      Schaut alles ganz gut aus.
      Nur öffnen kann ich die Datei immer noch nicht.

      Muss ich da jetzt auch was bei der Ausgabe änderen??

      // ausgabe

      $SQL = "SELECT dateiname, dateigroesse, dateityp, daten FROM anhang WHERE id=$id";
         $ResultPointer = mysql_query($SQL, $dbh);
         $Result=mysql_fetch_object($ResultPointer);

      header("Content-type: ".$Result->dateityp);
         header("Content-length: ".$Result->dateigroesse);
         header("Content-Disposition: attachment; filename=".$Result->dateiname);
         echo $data->Daten;

      Danke

      1. hallo,
        ich habe ein bisschen was umgeschrieben dadurch erkenne ich jetzt die größe der Datei richtig und kann diese auch öffnen.
        NUR wird der Inhalt nicht richtig dargestellt.

        die neue Version:

        Eingabe:

        PHP-Quellcode:

        <?php
        $data = mysql_real_escape_string(fread(fopen($_FILES['anhang']['tmp_name'], "rb"), $_FILES['anhang']['size']));
        $dateiname = mysql_real_escape_string($_FILES['anhang']['name']);
        $dateigroesse = mysql_real_escape_string($_FILES['anhang']['size']);
        $dateityp = mysql_real_escape_string($_FILES['anhang']['type']);

        $query="INSERT INTO anhang (dateiname,dateigroesse,dateityp,daten) ".
        "VALUES ('".$dateiname."', '".$dateigroesse."', '".$dateityp."', '".$data."')";

        $result=mysql_query($query);
        $datei_id= mysql_insert_id();
        ?>

        Ausgabe:

        PHP-Quellcode:

        <?php
        $SQL = "SELECT dateiname, dateigroesse, dateityp, daten FROM anhang WHERE id=$id";
        $ResultPointer = mysql_query($SQL, $dbh);
        $Result=mysql_fetch_object($ResultPointer);

        header("Content-type: ".$Result->dateityp);
        header("Content-length: ".$Result->dateigroesse);
        header("Content-Disposition: attachment; filename=".$Result->dateiname);
        echo $Result->daten;
        ?>

        1. hi,

          ich habe ein bisschen was umgeschrieben dadurch erkenne ich jetzt die größe der Datei richtig und kann diese auch öffnen.
          NUR wird der Inhalt nicht richtig dargestellt.

          Schau mal mit phpinfo() nach, ob bei dir magic_quotes_runtime aktiviert ist - wenn ja, würde dies dein fread() derart beeinflussen, dass im Binärdatenstrom "Sonderzeichen" wie Nullbytes maskiert werden, und das könnte dann deine Daten schon beim Eintragen in die DB korrumpieren.

          gruß,
          wahsaga

          --
          /voodoo.css:
          #GeorgeWBush { position:absolute; bottom:-6ft; }
          1. Schau mal mit phpinfo() nach, ob bei dir magic_quotes_runtime aktiviert ist -

            Ist leider nicht aktiviert dennoch danke