Dateien in Datenbank speichern

McUles

B1G-Software-Kunde
#1
Also, ich hab hier mal ein dringendes Problem an dem ich schon den ganzen Tag sitzte.
Ich muß Dateien in eine Datenbank hochladen und von dort auch wieder herunter laden können. Das man das normal über das Dateisstem macht weiß ich, geht aber in diesem Speziellen Fall leider nicht also keine Alternative.

Ich bin da ein wenig am Verzweifeln weil das ganze in MSSQL in einem Feld mit dem Typ Image gespeichert werden soll.

Hat das schon jemand gemacht und hat vielleicht ein Beispiel für mich?
addslashes funktioniert mit MSSQL nicht zuverlässig und base64 scheint mir bestimmte Dateien zu zerhacken.
 

patrick

Staff member
B1G-Software-Kunde
#2
Bae64 "zerhackt" nichts, wenn richtig angewendet. Der Fehler muss da irgendwo in deiner Implementierung liegen.
addslashes() eignet sich für sowas nicht, versuch mal mysql_real_escape_string().
Beachte auch die Limits in deiner my.cnf - eventuell kannst dein Query nur max. 1 MB (o.ä.) groß sein.
 

McUles

B1G-Software-Kunde
#3
Die PDF hatte nur ein paar KB.
Bilder lädt er einwandfrei hoch.

upload.php
Code:
foreach ($_FILES['files']['error'] as $key => $error) {
  if ($error == UPLOAD_ERR_OK) {
    $datei_open = fopen($_FILES['files']['tmp_name'][$key], 'rb');
    $datei_read = fread($datei_open, filesize($_FILES['files']['tmp_name'][$key]));
    $data = base64_encode($datei_read);
    $dateiname = str_replace(" ", "_", $_FILES['files']['name'][$key]); 
    $db->query("INSERT INTO tblDocuments (Document, FileName, FileType, FileSize) VALUES ('$data', '".$dateiname."', '".$_FILES['files']['type'][$key]."', '".$_FILES['files']['size'][$key]."');");
  }
}
download.php
Code:
while ($my_row = $db->get_row()) {
    $ausgabe = base64_decode($my_row['Document']);
    $type = $my_row['FileType'];
    $filename = $my_row['FileName'];
    $filesize = $my_row['FileSize'];
    header("Content-type: $type");
    header("Content-Description: File Transfer");
    header("Content-Disposition: attachment; filename=$filename");
    header("Content-Transfer-Encoding: binary\n");
    header("Content-Length: ".$filesize);
    echo $ausgabe;
  }
}
 

patrick

Staff member
B1G-Software-Kunde
#4
Wie viel Daten kann dein Document-Feld denn fassen?
(Vielleicht ist auch einfach beim Upload was schief gegangen? Oder hast du öfter getestet?)
Vielleicht solltest du die Datei-Größe auch besser per filesize() nach dem Upload selbst bestimmen - ich weiß nicht, wie verlässlich das $_FILES-Array da ist.
 

McUles

B1G-Software-Kunde
#5
Ich habe es öfter getestet, bei pdf und rar immer das selbe Problem.
Der files-Array passt so, das is nen JS Applet. Images hab ich erfolgreich größere als pdf hochgeladen.
Das pdf war nur ca. 50KB groß.
 

patrick

Staff member
B1G-Software-Kunde
#6
Man müsste das ganze mal schrittweise untersuchen, damit man weiß, wo es verloren geht.

Hast du die Möglichkeit, den Feldtyp in der MySQL-Tabelle zu ändern? Sowas kannst du am besten un-encodiert in einem BLOB speichern.
 

McUles

B1G-Software-Kunde
#7
Und genau da liegt das Problem, muß dafür eine MSSQL benutzen und da gibt es kein BLOB.
Muß image nutzen. Ist so vorgegeben.
 
Top