M$-WordDoc in Mysql-DB, wie geht das?

Alles, was MariaDB und MySQL betrifft, kann hier besprochen werden.

M$-WordDoc in Mysql-DB, wie geht das?

Postby juergen&lx » 06. February 2005 15:07

Hallo alle zusammen,

Ich möchte ein M$-WordDoc in Mysql-DB abspeichen..

Upload:
Code: Select all
            if(!empty($file_name)){
              if(copy($file,"tmp_dir/$file_name")){
                if(move_uploaded_file($file,"tmp_dir/tmpfile")){
                  echo "<b>Upload beendet!</b><br>";
                  echo "Dateiname: $file_name";
                  echo "<br>";
                  echo "Dateigröße: $file_size Byte";
                  echo "<br>";
                  //print_r($_FILES); // zeigt Probleme an
                  echo "<br>";
//                 $file_text = file_get_contents("tmp_dir/tmpfile"); //nur normale Textfiles
                 $handle = fopen("tmp_dir/$file_name","rb");
 $file_text = fread ($handle, filesize ("tmp_dir/$file_name"));
               }
              }
            }
funktioniert einwandfrei.
Bei INSERT/UPDATE
Code: Select all
UPDATE folien SET filename='tmpfile.doc',filesize='19456',text=' "DIVERSE ZEICHEN" 'WHERE fid='1425';Fehler beim Ändern der Daten[u]: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '³Ù0' at line 1
near '³Ù0'
ist in Doc.doc enthalten.
Die Mysql-Tabelle:
Code: Select all
Feld      Typ     Attribute     Null     Standard     Extra     Aktion
fid     int(11)         Nein     0                         
filename     varchar(255)         Ja        NULL
text            blob    BINARY        Ja         NULL                      
filesize     int(11)         Nein     0


Wo habe ich da einen oder mehrere Denkfehler?

Mfg
Jürgen
juergen&lx
 
Posts: 154
Joined: 18. February 2004 21:36
Location: in einem Dorf am Rande des Strombergs
Operating System: Linux

Postby Wiedmann » 06. February 2005 19:32

a) das copy() und move_uploaded_file() kannst du dir hier schenken (für was war das copy?).
b) file_get_contents() benutzen und die Quelledatei direkt aus $_FILES['foo']['tmp_name'] nehmen.
c) vor dem UPDATE-Query $file_text durch mysql_real_escape_string() schicken.
Wiedmann
AF Moderator
 
Posts: 17106
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Postby juergen&lx » 06. February 2005 21:51

Hallo Wiedmann,

Danke,
Deine Antworten sind immer wieder ein Volltreffer.

Es funktioniert.

:oops: Hast du zuuufälllliig auch 'ne Antwort zum Downloaden?? :oops:

Eine physisch vorhandene Datei kann man ja über <a href.... ansprechen.
Grüße vom Stromberg
Jürgen
juergen&lx
 
Posts: 154
Joined: 18. February 2004 21:36
Location: in einem Dorf am Rande des Strombergs
Operating System: Linux

Postby Wiedmann » 07. February 2005 01:05

Hi Jürgen,

mal das Grundprinzip:

a) Die eigentliche SQL-Abfrage
Code: Select all
SELECT `text`, ...
FROM `folien`
WHERE `id` = foo
LIMIT 0,1

sollte ja klar sein? --> das Word-Doc sollte also dann in einer Variablen sein (z.B. $row['text'])

b) setzen eines passenden Headers:
Code: Select all
header('Content-Type: application/msword');


c) Ausgeben des Dokumentes zum Browser:
Code: Select all
echo $row['text'];


Speziell beim setzen der Header könnte man noch mehr machen (Inline oder als Dateidownload und Dateiname vorgeben z.B.) Läuft aber analog ab wie arbeiten mit Bildern (GD) oder der pdflib.
Code: Select all
header('Content-Length: '.strlen($row['text']));
header('Content-Disposition: inline; filename="tmpfile.doc"');


Ach so:
Ein Script das obiges macht, referenzierst du dann wie gehabt mit
Code: Select all
<a href="download.php">Dokument herunterladen</a>

(Das Script tut also so, als wäre es die eigentliche Datei)
Wiedmann
AF Moderator
 
Posts: 17106
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Postby juergen&lx » 07. February 2005 22:21

Hallo Wiedmann,

vielen Dank für Deine Antwort.
Leider komme ich erst jetzt zum Antworten. Mit deinem o.g. Code bekomme ich zwar einen Download, der aber von M$-Word als plain-text interpretiert wird. Warum, :?: weiss ich nicht.
Mit nachfolgendem Code funktioniert es aber einwandfrei
Code: Select all
<?php
  $sql="SELECT filetype, filename, text FROM folien WHERE fid=$n LIMIT 0,1";
  $result = mysql_query($sql) or die("Fehler in Download-Anfrage: ".mysql_error());
  while($row=mysql_fetch_array($result)) {
    header('Content-Type: '.$row['filetype'].'');
    $file = file_put_contents ($row['filename'], $row['text']);
    header('Content-Length: '.$file);
    header('Content-Disposition: attachment; filename="'.$file.'"');
  }
?>

Referenziert wird
Code: Select all
<a href="download.php?n=4711 [filenummer oder was auch immer]">Dokument herunterladen</a>

:!: Es sollte auch wiederholt werden, das o.g. Code unbedingt in Extradatei wie "download.php" eingefügt wird, da sonst KEIN vernünftiges Ergebnis vorliegen wird. :!:

Viele Grüße und nochmals Danke
Jürgen

Nachtrag Info zum Header:
http://de2.php.net/manual/de/function.header.php

Jürgen
juergen&lx
 
Posts: 154
Joined: 18. February 2004 21:36
Location: in einem Dorf am Rande des Strombergs
Operating System: Linux


Return to MariaDB - MySQL

Who is online

Users browsing this forum: No registered users and 1 guest