我最近刚问过并解决了一个问题,该问题涉及将大于2 MB的.PDF文件作为BLOBS上传到MySQL数据库中。我不得不更改php.ini文件和MySQLs最大数据包设置中的一些设置。但是,修复此问题导致我发现我的脚本出现了新问题。
现在,由于我可以将文件上传到我的BLOB数据库,因此我尝试下载该文件以进行测试。令我沮丧的是,当我打开.PDF文件时,我收到以下错误:无法加载文档(错误3)'file:///tmp/test-13.pdf'。经过进一步调查,我发现正在下载的文件test.pdf只有1 MB,比数据库中假定大小的一半还要少于2 MB。这显然是错误的原因。
以下代码是我用于从数据库下载文件的脚本的一部分。它位于脚本的最顶端,对于小于1 MB的文件完美无瑕地工作。
foreach($_REQUEST as $key => $value)
{
if ($value == 'Open')
{
header();
session_start();
$dbh = new PDO('mysql:host='.$_SESSION['OpsDBServer'].'.ops.tns.its.psu.edu;
dbname='.$_SESSION['OpsDB'], $_SESSION['yoM'], $_SESSION['aMa']);
$id = $key;
$sqlDownload = "SELECT name, type, content, size FROM upload WHERE
id='".$id."'";
$result = $dbh->query($sqlDownload);
$download = $result->fetchAll();
$type = $download[0]['type'];
$size = $download[0]['size'];
$name = $download[0]['name'];
$content = $download[0]['content'];
header("Content-type: $type");
header("Content-Disposition: inline; filename=$name");
header("Content-length: $size");
header("Cache-Control: maxage=1");
header("Pragma: public");
echo $content;
exit;
}
}
我在想,也许我有一些标题声明错了?我很困惑该怎么做。我搜索了php.ini,我发现没有我认为需要更改的设置,MySQL的最大数据包设置为4 MB,因此需要下载2 MB。
感谢您的帮助。
答案 0 :(得分:2)
根据(http://dev.mysql.com/doc/refman/5.0/en/blob.html):
最大尺寸 BLOB或TEXT对象由。确定 它的类型,但你最大的价值 实际上可以在之间传输 客户端和服务器由确定 可用内存量和 通信缓冲区的大小。 您可以更改消息缓冲区大小 通过改变的价值 max_allowed_packet变量,但是你 必须为服务器和服务器执行此操作 您的客户计划。
根据(http://dev.mysql.com/doc/refman/5.0/en/server-parameters.html),max_allowed_packet的默认值为1048576。
答案 1 :(得分:2)
我确实解决了这个问题。我更改了php.ini和my.cnf中推荐的所有值,但我还需要更改PDO的设置。
我改变了: PDO :: MYSQL_ATTR_MAX_BUFFER_SIZE(整数) 最大缓冲区大小。默认为1 MiB。
创建PDO对象时必须设置此项。一切都很好。