上传的中型blob在下载时被截断

时间:2014-02-09 22:22:50

标签: php mysql

我将blob上传到我的sql数据库表中,其字段定义为 medium blob 。 blob实际上是一个大小为4.3mb的pdf文件。该文件通过ftp上传。上传后,一些PHP代码将其插入数据库。我已经检查了ftp文件夹中的文件,我可以正确查看它。我已经检查了数据库中的文件(blob),我可以正确查看它。两种尺寸均显示为4.3mb。如果我尝试使用其他程序员提供的某些代码(下面)下载该文件,则该文件将被截断为大约300kb。

if (!($dbLink = mysql_pconnect($db_server,$db_id,$db_pwd)))
{
    print("Failed to connect to database!<BR>\n");
    exit();
}
if(!mysql_select_db($db_name,$dbLink))
{
    print("Cannot use the database!<BR>\n");
    exit();
}

$query = "SELECT name, type, content FROM table_name WHERE link_id = '" . $id . "'";

$result = mysql_query($query, $dbLink) or die('Error, query failed');
list($name, $type, $content) = mysql_fetch_array($result);

//header("Content-length: $size");
header("Content-type: $type");
header("Content-Disposition: attachment; filename=$name");
echo $content;
exit;

我检查了MySQL中的最大数据包大小,看起来大约是256mb。我的php.ini显示10mb的帖子。我不知道文件被截断的原因。有人可以指出我正确的方向来解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

PHP和MySQL之间的PDO接口提供了一个用于LOB处理的流式传输方案。看看它的开发人员多年前放弃了mysql_接口,可能值得尝试。

请参阅:http://www.php.net/manual/en/pdo.lobs.php

您可以考虑使用这样的代码。

$db = new PDO('mysql:dbname=testdb;host=127.0.0.1', 'username', 'password');

$query = "SELECT name, 
                 type, 
                 OCTET_LENGTH(content) AS length, 
                 content 
            FROM table_name 
           WHERE link_id = :link_id
           LIMIT 1";

$stmt = $db->prepare($query);
$stmt->execute(array(":link_id" => $id));

$stmt->bindColumn(1, $name);
$stmt->bindColumn(2, $type);
$stmt->bindColumn(3, $length);
$stmt->bindColumn(4, $data, PDO::PARAM_LOB);  /* binds as a stream */

if ($stmt->fetch(PDO::FETCH_BOUND)) {

    header("Content-Type: $type");
    header("Content-Length: $length");
    header("Content-Disposition: attachment; filename=$name");
    fpassthru($data);
}

很抱歉,我没有调试过这个。但这是一个相当常见的用例。

答案 1 :(得分:0)

我用不同的方法解决了这个问题。无论我从几个不同的例子中尝试过什么,我都无法获得建议的PHP代码来停止截断文件。我停止将文件存储为数据库中的附件,并将其存储在服务器上的单独文件夹中。更新了数据库以插入文件的“路径”链接。我将php代码更改为:

// Construct an HTTP header that will force the browser to display/download the file.
      header("Location: ".$location); 
      ob_flush();
      exit;

这会强制重定位到存储在服务器上的实际文件。该文件现在在浏览器中打开。注意:我还必须更改一些html代码以强制文件在浏览器的新选项卡中打开。