【问题标题】:I can't upload pdf to my mysql database我无法将 pdf 上传到我的 mysql 数据库
【发布时间】:2013-11-07 07:29:55
【问题描述】:

我是 PHP 初学者,我正在尝试将 PDF 上传到我的 MySQL 数据库。我尝试添加一些代码以使其与 pdf 兼容,但它不起作用,所以我将其删除,并且我有可以上传 .txt、word 文档、图像等但不能上传 PDF 的 PHP 脚本。你建议我应该添加什么,以便它适用于 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"; }
} 
?>

【问题讨论】:

  • 你在哪里检查文件类型?我在你的代码中没有看到。
  • 您的“内容”列是什么字段类型?文本?将整个 pdf 内容存储在其中可能是不够的(TEXT 只能包含 65,535 字节的数据)。为什么不直接把文件上传到服务器,然后把路径保存在数据库里呢?
  • 为什么要把文件放到数据库里呢,为什么不正常上传到正常目录,把路径存到数据库里,这也是我早期编程时犯的错误年
  • 我会尝试这样做。谢谢大家
  • 直接将images/txt/pdf文件保存在数据库中,会使数据库变得繁重,所以将此文件上传到服务器上,并将文件路径保存在数据库中。

标签: php mysql pdf


【解决方案1】:

魔术引号已被弃用很长时间。你不应该再使用它了。从 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)。然后,您的文件可以随心所欲地变大,而不会牺牲数据库的性能。

【讨论】:

    【解决方案2】:

    您应该将其存储为二进制数据。所以列类型为BLOB(或MEDIUMBLOB 等,取决于文件有多大——以及用户可以上传多少)。这样,几乎可以存储任何类型的文件内容。

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

    【讨论】:

      猜你喜欢
      • 2020-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-29
      • 1970-01-01
      • 1970-01-01
      • 2018-02-06
      • 2016-08-16
      相关资源
      最近更新 更多