2012-01-10 9 views
1

Drupal CMSに保存された画像データの印刷セッションに問題があります。結果ページはアップロードされたイメージデータではなく6バイトのコンテンツを取得します。セッション保存ファイルの内容をPHPでオクテットストリームとして出力する方法は?

コードを記憶する画像は、次のとおりです。

// 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. ストアアップロードされたファイルの一時的な場所で、それを提供しています。私が欲しいもの、別の

から

  • 変更コンテンツタイプは、それが(オクテットストリームなど)、ブラウザにそのままアップロードされたファイルの内容を印刷することです。私は本当にありがとうございます。

    更新されたコード:

    // 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; 
    

    しかし、静止画コンテンツが表示されません。画像コンテンツの文字の一部は、アップロードされた画像コンテンツと元の画像コンテンツとを比較したときに、他のものに変換される。

  • +1

    コンテンツ長のヘッダーを追加することもできますが、コードは見た目がよくなります。デバッグのために、ディスクに保存されているセッションを調べる必要があります。[シリアライズされたライブラリ](https://github.com/ktomk/Serialized)には[セッションファイルビューアの例](https://github.com)があります。/ktomk /シリアライズ/ blob/master/examples/03-session/example-viewer。PHP)。魅力のように動作します。 – hakre

    +0

    @hakre - コメントありがとうございます。コンテンツ長のヘッダー値を追加しました(投稿が編集されました)が、一部の内部文字が他の文字に変換されるため、静止画像は表示されません。 –

    +1

    さて、あなたはここで幾分迷っています。 'Content-Length'は提案だけでした。間違った答えから間違ったコード例をコピーしました。コンテンツの長さをスキップして、問題の元の原因がストレージレイヤーとそのインターフェイスにあるおそらく見つかるまでスキップします。通常、セッションデータにはbase64を使用する必要はありません。PHPはバイナリデータを文字列の中で非常にうまくサポートします。 – hakre

    答えて

    1

    それらを追加してみてください:画像コンテンツが変更され

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

    提案したヘッダー値に従ってコードを変更しました。しかし、画像が壊れているか、見えません。 (投稿は新しいコードで更新されています) –

    +0

    'Content-Length:'はコードポイントの長さではなくOCTETですhttp://tools.ietf.org/html/rfc2616#section-14.13 – hakre

    +0

    これはまさに 'latin1文字列中でutf-8と解釈される文字があっても、文字列中の8ビットあたり1バイト(latin1は8ビットの文字のみをサポートします)をカウントし、ユニコードのように16,32はカウントしません。文字列からディスクに保存せずにファイルサイズを取得するより良い方法を知っていれば、丁寧に教えてください...このコメント(Peter Albertsson 10-Nov-2004 10:21)はこちらをご覧ください:http://www.php.net /manual/en/function.mb-strlen.php#47309 – bardiir

    0

    、符号化タイプが原因であってもよいです。セッションに保存されたデータをクライアントに印刷すると、一部の文字が消えてしまいました。これは、セッションがデータベースに格納されるときに、Drupalセッション処理の影響を受ける可能性があります。

    すべての問題を解決するソリューションは、base64_encodeとstoreでした。次に、ajax呼び出しを介してbase64でエンコードされたソースとしてコンテンツを取得します。

    コードは:JavaScriptコードで

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

    imgフィールドsrcにimg_src値を設定します。


    編集:根本的な原因が見つかりました。それはモジュールの一部であり、サーバーにアップロードされた関連ファイルはファイルの先頭にBOM(Byte Order Mark)文字を持ち、UTF-8暗号化用のBOM文字を持つ時間があります。 BOMをUTF-8ストリームにすることはお勧めしません。ブラウザの中には、特にIEやChromeのレンダリングやコンテンツに関連する問題が報告されているものがあります。

    関連する問題