2

无论好坏,我将二进制信息存储在数据库表中并且在检索它时遇到问题。每个 BLOB 在检索时都有一个换行符,至少,我相信它是在检索时,因为表中的二进制对象与源文件的大小完全相同。

我搜索了一个与我类似的问题,我发现最接近的是这个 但是,我使用的是 PDO 而不是 mysql_* 并且我在打开之前检查了空行

这是存储在一个单独文件中的检索函数,我将其包含在我的测试中:

(在 raw.php 中):

function return_raw_rawid($raw_id)  {
    $data = array();
    $aggregate_data = array();
    $sql = "SELECT * FROM `raw` WHERE `raw_id` = :rawid";

    try {
        $db_obj = dbCore::getInstance();
        $query = $db_obj->dbh->prepare($sql);
        $query->bindValue(':rawid', $raw_id);

        if ($query->execute()) {
            while($results = $query->fetch(PDO::FETCH_ASSOC))   {
                $data['raw_id']     = $results['raw_id'];
                $data['filename']   = $results['filename'];
                $data['mime_type']  = $results['mime_type'];
                $data['file_size']  = $results['file_size'];
                $data['file_data']  = $results['file_data'];
                $data['test_id']    = $results['test_id'];
                $data['user_id']    = $results['user_id'];
                $data['time']       = date('Y-m-d H:i:s', $results['time']);
                $aggregate_data[]   = $data;
            } // while
        }  // if
        $query->closeCursor();

        return $aggregate_data;

    } catch (PDOException $ex) {
        $errors[] = $ex;
    } // catch
}

这是我在一个单独的文件中测试它的代码:

<?php 
include 'core/init.php'; // Contains protect_page() and includes for return_raw_rawid
protect_page();
$blob_id = 20;
$blob = return_raw_rawid($blob_id);
$data = ltrim($blob[0]['file_data']);
$name = ltrim($blob[0]['filename']);
$size = ltrim($blob[0]['file_size']);
$type = ltrim($blob[0]['mime_type']);
header("Content-type: $type");
header("Content-length: $size");
header("Content-disposition: attachment; filename=$name");
header("Content-Description: PHP Generated Data");
echo $data;

当我在浏览器中加载此页面时,它会提示我下载由 blob_id 标识并具有正确文件名和类型的文件。但是,在下载并在 ghex 中打开后,我看到第一个字节是 '0A' 使用

cmp original_file 下载的_file
我确定唯一的区别是第一个字节。谷歌搜索让我找到了我(也许也是)在上面自由应用的 ltrim() 函数。

我不能确定这个问题是否不是在上传过程中引起的,但正如我之前所说,我不相信这是因为 phpmyadmin 中的“file_size”值与源文件完全相同。我不确定在检索函数中使用 aggregate_data 数组是否是罪魁祸首或什么。

任何帮助是极大的赞赏!

4

1 回答 1

0

您确定这 4 个标题行正在正确执行吗?0x0A 是换行符。您可以在 core/init.php 触发输出中有一个换行符,并且标头永远不会执行。关闭 display_errors/error_reporting 后,您将永远不会看到有关“未发送标头 - 输出从第 X 行开始...”的警告。

于 2012-11-27T14:57:27.347 回答