无论好坏,我将二进制信息存储在数据库表中并且在检索它时遇到问题。每个 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 数组是否是罪魁祸首或什么。
任何帮助是极大的赞赏!