良くも悪くも、バイナリ情報をデータベース テーブルに格納していて、取得に問題があります。テーブル内のバイナリオブジェクトはソースファイルとまったく同じサイズであるため、各 BLOB には取得時に先頭に改行が追加されています。少なくとも、取得時には改行が追加されていると思います。
私は私のものと同様の問題を検索しましたが、私が見つけた最も近いものはこれ ですしかし、私はmysql_ *の代わりにPDOを使用しており、開く前に空の行をチェックしました
テストに含めている別のファイルに保存されている取得関数は次のとおりです。
(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 Download_file唯一の違いはこの最初のバイトだと判断しました。グーグルは、私が(おそらくあまりにも)上で自由に適用した ltrim() 関数に私を導きました。
この問題がアップロード中に発生していないかどうかはわかりませんが、前に述べたように、phpmyadmin の「file_size」の値がソース ファイルとまったく同じであるため、そうではないと思います。検索関数での aggregate_data 配列の使用が原因なのかどうかはわかりません。
どんな助けでも大歓迎です!