我在 LAMP 环境中的 Drupal 下运行了一个应用程序。它从数据库中提供图像。在我的个人机器(OS X Lion)上,它工作正常。在开发服务器 (Amazon EC2) 上,完全相同的代码不起作用。两台服务器都运行 PHP 5.3。我已经确认数据echo $fileData
在浏览器接收到数据之间已损坏。此外,我已经确认如果数据是 base64 编码的,则数据不会损坏(我使用脚本来请求数据,对其进行解码并将其保存到文件中)。
在 Drupal 方面,代码位于创建菜单回调的模块中;回调函数直接回显文件数据以避免将整个图像存储在内存中(我使用 PDO::FETCH_BOUND 和 PDO::PARAM_LOB 来创建一个流,但是当我试图找到问题时它现在正在进入一个字符串; 不是这样)。菜单条目有一个自定义的传递回调,它基本上什么都不做。我尝试刷新任何输出缓冲,认为 Drupal 可能过于努力地支持 Unicode 或其他东西,但这也无济于事。
我希望有人知道可能导致我的问题的原因。如果我还不够清楚,我会发布一些代码;现在它充满了注释掉的功能,所以需要一些清理。
更新1:
我整理了一些示例代码,但没有出现错误;我可以将代码转换为 Drupal 模块来测试该代码堆栈。但是,我已将错误范围缩小到echo $fileData
. 代码看起来像这样:
function example_menu() {
$pages['mpicture/%'] = array(
'title' => 'Picture handler',
'page callback' => 'example_picture',
'page arguments' => array(1),
'delivery callback' => 'example_deliver_png',
'access callback' => TRUE,
'type' => MENU_CALLBACK,
);
}
function example_picture($fileID) {
// Point 1
example_output_file($fileID);
}
function example_deliver_png($content) {
}
function example_output_file($fileID) {
$statement = db_select('mfiles', 'f')
->fields('f', array('fileType', 'fileSize', 'fileData', 'fileData64', 'lastModified'))
->condition('fileID', $fileID, '=')
->execute();
if ($file = $statement->fetchAssoc()) {
header('Content-Type: ' . $file['fileType']);
// Point 2
header('Content-Length: ' . $file['fileSize']);
echo $file['fileData'];
}
}
这不起作用。如果我改成Point 2
这样:
// Point 2
header('Content-Length: ' . $file['fileSize']*4/3);
echo $file['fileData64'];
只要我的客户端base64_decode
在输出上运行 a ,它就可以正常工作。但是,如果我这样做:
// Point 1
ob_start()
example_output_file($fileID);
$output = base64_encode(ob_get_clean());
header('Content-Length: ' . strlen($output));
echo $output;
...它不适用于同一个base64_decode
ing 客户端。怎么可能?
是的,我将数据存储了两次;在我运行的每一个测试中,我是否使用都没有关系$file['fileData']
,base64_decode($file['fileData64'])
所以我认为这不是数据库问题。
更新 2:
但奇怪的是,这有效:
// Point 1
ob_start()
example_output_file($fileID);
$output = base64_encode(trim(ob_get_clean()));
header('Content-Length: ' . strlen($output));
echo $output;
所以,我想现在我试图找到打印空白的位置?