2013-10-28 51 views
0

我是一名PHP初学者,我正尝试将PDF上传到我的MySQL数据库。我试图添加一些代码,使其兼容pdf,但它没有工作,所以我删除它,我有PHP脚本,可以上传.txt,word文档,图像等,但不是PDF。你建议我应该添加什么,所以它适用于PDF。这是我的脚本。我无法上传PDF到我的mysql数据库

<html> 
<head></head> 
<body> 
<form method="post" enctype="multipart/form-data"> 
<table width="350" border="0" cellpadding="1" 
cellspacing="1" class="box"> 
<tr> 
<td>Select a file to upload</td> 
</tr> 
<tr> 
<td> 
<input type="hidden" name="MAX_FILE_SIZE" 
value="16000000"> 
<input name="userfile" type="file" id="userfile"> 
</td> 
</tr> 
<tr> 
<td width="80"><input name="upload" 
type="submit" class="box" id="upload" value=" Upload "></td> 
</tr> 
</table> 
</form> 
</body> 
</html> 
<?php 
if(isset($_POST['upload']) && $_FILES['userfile']['size'] > 0) 
{ 
$fileName = $_FILES['userfile']['name']; 
$tmpName = $_FILES['userfile']['tmp_name']; 
$fileSize = $_FILES['userfile']['size']; 
$fileType = $_FILES['userfile']['type']; 
$fileType=(get_magic_quotes_gpc()==0 ? mysql_real_escape_string(
$_FILES['userfile']['type']) : mysql_real_escape_string(
stripslashes ($_FILES['userfile']))); 
$fp  = fopen($tmpName, 'r'); 
$content = fread($fp, filesize($tmpName)); 
$content = addslashes($content); 
fclose($fp); 
if(!get_magic_quotes_gpc()) 
{ 
    $fileName = addslashes($fileName); 
} 
$con = mysql_connect('localhost', 'root', '') or die(mysql_error()); 
$db = mysql_select_db('test', $con); 
if($db){ 
$query = "INSERT INTO upload (name, size, type, content) ". 
"VALUES ('$fileName', '$fileSize', '$fileType', '$content')"; 
mysql_query($query) or die('Error, query failed'); 
mysql_close(); 
echo "<br>File $fileName uploaded<br>"; 
}else { echo "file upload failed"; } 
} 
?> 
+0

你在哪里检查文件类型?我没有看到你的代码。 – putvande

+0

什么字段类型是您的“内容”列?文本?它可能不足以存储整个pdf内容(TEXT只能包含65,535字节的数据)。你为什么不把文件上传到服务器并在数据库中保存它的路径? – davey

+2

为什么你想要在数据库中的文件?为什么不正常上传到一个正常的目录,并将路径存储在数据库中,这是一个错误,我也在我的早期编程年 – Lappies

回答

0

您应该将其存储为二进制数据。所以列类型BLOB(或MEDIUMBLOB等,取决于文件的大小 - 以及用户可以上传多少)。因此,存储几乎任何类型的文件内容都不是问题。

此外,我不认为你应该在内容中添加斜杠并直接在查询中插入值,而是考虑使用参数。阅读PHP数据对象(PDO:http://php.net/manual/en/book.pdo.php),这是一个非常好的和安全的(如果使用正确!)扩展名与数据库交互。

0

魔术报价已被弃用了很长时间。你不应该再使用它了。自PHP 5.4起,它是removed from the language。尤其是,在编写新脚本时,应该避免这种被遗弃的功能。

如果您的文件很大,需要使用PHP文件上传脚本进行处理,您可能有兴趣更改设置,如post_max_size。有关更多详细信息,请参阅以下主题:Increasing the maximum post size

而不是通用文本处理函数addslashes您应该使用与您的数据库系统匹配的转义函数。在这种情况下,它是mysqli_real_escape_string。 由于PDF文件包含二进制数据并且没有文本,因此您不应在保存和读取(文本处理)后添加和删除斜杠。将数据插入数据库时​​,只需使用足够的MySQL函数即可转义二进制内容blob。 适用于整个文件的列类型是MEDIUMBLOB。它允许数据长度高达〜16 MB。

在谈到php方面之后,还提供了一些关于MySQL的提示。 MySQL限制了发送给它的数据包的长度。如果您使用共享主机平台(并且不使用专用服务器),那么机会仅限于1 MB。相关的配置选项是max_allowed_packet。此设置将限制将文档存储在数据库中的能力。有关如何解决此问题的建议,请参阅this thread

在我看来,在大多数情况下,将整个文档存储到关系数据库是一个坏主意。我通常将文件元数据(大小,文件名,MIME类型,......)放入数据库表中,并将上传的二进制数据存储在公众无法读取的普通文件系统目录中(例如/srv/uploads)。然后你的文件可以变得像你想要的那么大,而不会牺牲数据库的性能。

相关问题