2011-02-16 142 views
0

我一直在这一整天,我似乎无法弄清楚。我们的客户希望我们将他们上传的文件保存到我们数据库(mssql)的表格中。目前,以什么样的文件,他们可以上传所以以下的有限的知识,我有我做了一些谷歌搜索,并试图没有限制如下:将文件保存到varbinary(max)字段?

我创造了这个表:

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] [微软] [SQL 服务器]闭合的引号之后[ 本机客户端10.0的SQL Server] 字符字符串' '。 [42000] [102] [Microsoft] [SQL Server Native Client 10.0] [SQL 服务器]“ ”附近的语法不正确。

现在我明白这是该文件的打破了SQL内容的问题,但我有不知道如何对付它们(或如何将它们转换成不会打破SQL字符串)。任何帮助将不胜感激,因为我完全失去了这一点。

(是的,我知道我还没有从攻击保护自己这里,但现在我只是想获得基本工作)

+0

您是否使用PHP的Mssql中的驱动程序或微软的SQLSRV? – Hamish 2011-02-16 20:09:27

+0

你为什么要在二进制数据上调用`addslashes()`? – drudge 2011-02-16 20:10:45

+0

@Hamish:我正在使用sqlsrv驱动程序。 @jnpcl:这是我忘记删除的东西(它现在不在我的代码中)。我基本上只是在尝试,因为我的很多错误都与引号有关,所以我想看看它是否能解决问题。 – Gazillion 2011-02-16 20:15:58

回答

0

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

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

而且,我不知道,你应该addslashes您的数据。我从来没有在PHP中使用MSSQL,所以我不能说。

1

在我的情况下与微软sqlsrv驱动程序到目前为止最简单的方法是使用params!避免使用引用您的二进制数据,并进入数据库,就像它...

代码片段:

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