如何在PHP中将会话存储的文件内容打印为八位字节流?

时间:2012-01-10 07:02:35

标签: php session drupal-6

我在Drupal CMS中打印会话保存的图像数据时遇到问题。结果页面获得6个字节的内容,而不是我上传的图像数据。

图像存储代码为:

// Read content of the uploaded file
$file_content = file_get_contents($_FILES["image_field"]["tmp_name"]);
// Strore the file in the session
$_SESSION['session_image'] = $file_content;

然后在另一个页面中,我正在打印会话存储的数据。 代码:

// Set content type - octet-stream
header("Content-type: application/octet-stream");
// Print the session stored image back
echo $_SESSION['session_image'];
// Exit
exit;

我不想将以下内容作为解决方案:

  1. 将上传的文件存储在临时位置并提供服务。
  2. 将内容类型更改为另一种
  3. 我想要的是将上传的文件内容打印到浏览器(作为八位字节流)。我真的很感激,如果有人可以提供帮助。

    更新代码:

    // Read content of the uploaded file
    $file_content = file_get_contents($_FILES["image_field"]["tmp_name"]);
    // Strore the file in the session
    $_SESSION['session_image'] = base64_encode($file_content);
    

    // Modified to have base64 encoded content to store so decode it here
    $content = base64_decode($_SESSION['session_image']);
    header("Content-Transfer-Encoding: binary");
    header("Content-Length: ". mb_strlen($content, 'latin1'));
    // Set content type - octet-stream
    header("Content-type: application/octet-stream");
    // Print content
    echo $content;
    exit;
    

    但图像内容仍然不可见。当上传的图像内容与原始图像内容进行比较时,图像内容的某些字符会被转换为其他字符。

2 个答案:

答案 0 :(得分:1)

尝试添加:

header("Content-Transfer-Encoding: binary"); 
header("Content-Length: ". mb_strlen($_SESSION['session_image'], 'latin1')); 

答案 1 :(得分:0)

图像内容发生变化,可能是由于编码类型。将会话存储的数据打印回客户端时,某些字符已消失。这可能会因Drupal会话处理而产生影响,因为它会在数据库中存储会话。

解决方案是克服所有问题,即base64_encode和store。然后通过ajax调用将内容检索为base64编码的源。

代码是:

print ' img_src = "data:image/*;base64,". $_SESSION['session_image'] . '"';

在javascript代码中,将img_src值设置为img字段src。


已编辑:已找到根本原因。上传到服务器的一些模块和相关文件在文件开头有BOM(字节顺序标记)字符,并且它导致一些时间具有用于UTF-8加密的BOM字符。建议不要使用UTF-8流的BOM,有些浏览器会报告呈现和内容相关的问题,尤其是在IE和Chrome中。