Größtes Problem war, dass gespeicherten Dateien beim Auslesen (Select) abgeschnitten wurden. Nach einigem Hin und Her mit verschiedenen Spaltentypen und dem Versuch mittels base64 Kodierung das Problem zu lösen bin ich nach langer Suche im Netz auf folgende Tatsachen gestoßen:
- MsSQL benötigt eine spezielle Form, in der das File in die Query geschrieben wird
- MsSQL schneidet per Default eben genau an einer bestimmten Stelle ab
Gelöst hab ich das Problem im Code so:
// Inhalt der Datei auslesen
$datastring = file_get_contents($_FILES["testfile"]["tmp_name"]);
// Weil MsSQL die Daten als "unquoted hexadecimal byte-string" erwartet
$data = unpack("H*hex", $datastring);
// Inhalt der Datei auslesen
$datastring = file_get_contents($_FILES["testfile"]["tmp_name"]);
// Weil MsSQL die Daten als "unquoted hexadecimal byte-string" erwartet
$data = unpack("H*hex", $datastring);
In der Query habe ich dann geschrieben:
$sql = "INSERT INTO dbo.test ([file]) VALUES (0x".$data['hex'].") ";
Damit die Dateien beim auslesen/abfragen aus der Datenbank nicht abgeschnitten werden, sollte man die entsprechenden php.ini Paramenter einstellen (mssql.textlimit und mssql.textsize). Diese stehen als Default meist auf 4000 oder 8000 Bytes.
Alternativ kann man auch per Query die textsize hochsetzen ("SET TEXTSIZE 2147483647;").
$sql = "INSERT INTO dbo.test ([file]) VALUES (0x".$data['hex'].") ";
Damit die Dateien beim auslesen/abfragen aus der Datenbank nicht abgeschnitten werden, sollte man die entsprechenden php.ini Paramenter einstellen (mssql.textlimit und mssql.textsize). Diese stehen als Default meist auf 4000 oder 8000 Bytes.
Alternativ kann man auch per Query die textsize hochsetzen ("SET TEXTSIZE 2147483647;").
Klingt so, als sollte man sich mehrmals überlegen, MsSQL zu verwenden.
AntwortenLöschenSpaß beiseite, ist die Lösung nun DB-portabel?
Also ich mußte ja in einer bestehenden Applikation den Code umschreiben. Ich werde bald probieren, das Ganze nach Doctrine zu portieren, dann sollte es portabel sein.
AntwortenLöschen