我无法将pdf上传到我的mysql数据库

时间:2013-10-28 13:36:22

标签: php mysql pdf

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

    <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"; }
} 
?>

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分: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} )。然后,您的文件可以变得像您想要的那样大,而不会牺牲数据库的性能。