将文件保存到varbinary(max)字段?

时间:2011-02-16 20:04:28

标签: php sql-server file-upload

我整天都在这,我似乎无法弄明白。我们的客户希望我们将他们上传的文件保存到我们数据库(mssql)的表中。对于他们可以上传什么类型的文件没有限制,所以在我有限的知识后,我做了一些谷歌搜索并尝试了以下内容:

我创建了这个表:

CREATE TABLE files
  (
    id int NOT NULL PRIMARY KEY IDENTITY,
    name varchar(256),
    content varbinary(max) NOT NULL,
    type varchar(30) NOT NULL,
    size int NOT NULL
    table_id INT NOT NULL FOREIGN KEY REFERENCES myTable(id)
   );

然后我尝试添加这样的内容:

$newfileName = $_FILES['uploadfile']['name'];
$newtmpName  = $_FILES['uploadfile']['tmp_name'];
$newfileSize = $_FILES['uploadfile']['size'];
$newfileType = $_FILES['uploadfile']['type'];

//need to get the content of the file
$fp = fopen($newtmpName, 'r');
$file_content = fread($fp, filesize($newtmpName));
$file_content = $file_content;
fclose($fp);

$sql = 'INSERT INTO files ([name], [content], [type], [size], [table_id]) VALUES ("'.$newfileName.'",CAST("'.$file_content.'" AS varbinary(max)),"'.$newfileType.'","'.$newfileSize.'","'.$table_id.'")';

但它只是不起作用...我可以上传txt文件没问题,但其他任何东西都会破坏。我得到如下错误(每个文件都不同):

  

[42000] [105] [Microsoft] [SQL Server   Native Client 10.0] [SQL   服务器]之后的未闭合引号   字符串' '。   [42000] [102] [微软] [SQL Server   Native Client 10.0] [SQL   服务器]' '附近的语法不正确。

现在我认为这是打破SQL的文件内容的一个问题,但我有 NO CLUE 如何处理它们(或者如何将它们转换为不会破坏的字符串sql)。任何帮助都会非常感激,因为我完全迷失了。

(是的,我知道我没有在这里保护自己免受攻击,但是现在我只是想让基础工作起作用)

3 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

在我的情况下使用Microsofts sqlsrv-Driver到目前为止最简单的方法是使用params!这样可以避免在二进制数据中使用引号,并且它就像它一样进入数据库......

代码段:

$sql = "INSERT INTO tablename (binaryImageField) VALUES (CAST (? AS varbinary(max)))";
$params = array($binaryImageData);
sqlsrv_query($con,$sql,$params);

答案 2 :(得分:0)

尝试使用fopen的二进制标志(b):

$fp = fopen($newtmpName, 'rb');
$file_content = fread($fp, filesize($newtmpName));

此外,我不确定您应该addslashes您的数据。我从未在PHP中使用MSSQL,所以我不知道。