1

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'];

私のクライアントが出力で a を実行している限り、正しく動作しbase64_decodeます。ただし、これを行うと:

  // Point 1
  ob_start()
  example_output_file($fileID);
  $output = base64_encode(ob_get_clean());
  header('Content-Length: ' . strlen($output));
  echo $output;

base64_decode...同じing クライアントでは動作しません。それはどうしてでしょうか?

はい、データを 2 回保存しています。私が実行するすべてのテストで、使用するかどうかは問題ではない$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;

それで、空白が印刷される場所を見つけようとしていると思いますか?

4

1 に答える 1

1

インターンの首を絞めます。私はそれを誓います。そうじゃない、表現だけど… 腹立つ。

全体の問題は、彼が追加した新しいファイルの末尾に空白があったためです。単純な「?>\n」。これにより、画像ハンドラーを含むサーバー上のすべてのページの前に空白が出力されました。空白が原因で画像が破損していました。

ここでの教訓は、ファイルの末尾にある PHP タグを決して閉じないことであり、一緒に作業するすべての人が同じことを行うようにすることだと思います。

于 2012-09-19T19:01:31.103 に答える