BLOB下载截断为1 MB脚本适用于小于1 MB的文件

时间:2009-10-16 19:35:00

标签: php mysql blob

我最近刚问过并解决了一个问题,该问题涉及将大于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。

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

根据(http://dev.mysql.com/doc/refman/5.0/en/blob.html):

  

最大尺寸   BLOB或TEXT对象由。确定   它的类型,但你最大的价值   实际上可以在之间传输   客户端和服务器由确定   可用内存量和   通信缓冲区的大小。   您可以更改消息缓冲区大小   通过改变的价值   max_allowed_pa​​cket变量,但是你   必须为服务器和服务器执行此操作   您的客户计划。

根据(http://dev.mysql.com/doc/refman/5.0/en/server-parameters.html),max_allowed_pa​​cket的默认值为1048576。

答案 1 :(得分:2)

我确实解决了这个问题。我更改了php.ini和my.cnf中推荐的所有值,但我还需要更改PDO的设置。

我改变了: PDO :: MYSQL_ATTR_MAX_BUFFER_SIZE(整数) 最大缓冲区大小。默认为1 MiB。

创建PDO对象时必须设置此项。一切都很好。