我無法讓位於我的MySQL數據庫中稱爲appFiles的表中blob字段中成功上傳的文件返回並顯示。我已經閱讀了很多演示,大部分都很相似,但沒有一個解決了我的問題。我很久以前就做過這個,但是這個舊項目的代碼是用mysqli完成的,我希望成爲100%PDO的基礎。以下是我處理該文件的代碼部分:使用PHP下載存儲在MySQL中的文件
} else if($ctoken === $utoken) {
// Our tokens match, proceed with the view
$stmt = $conn->prepare("SELECT fileMime, fileSize, fileName, file FROM $database.appFiles WHERE fileID = :fileid");
$stmt->bindParam(':fileid', $_GET['fid'], PDO::PARAM_INT, 11);
$stmt->execute();
$fRes = $stmt->fetchAll();
header('Content-Disposition: attachment; filename="' . $fRes[0][fileName] . '"');
ob_clean();
flush();
echo $fRes[0][file];
exit;
}
現在我知道數據正在成功從數據庫中選出。我可以通過執行var_dump($ fRes)來輕鬆檢查。它看起來好像都在那裏,儘管它當然大部分都是二進制混亂,並且似乎成爲大多數其他雜亂無章的問題中的問號。
當我在PDF文檔上測試它時,它只是在屏幕上吐出二進制文件。當我使用DOC/DOCX文件進行測試時,它至少會嘗試在MS Word中打開它,但會告訴我文件轉換已中斷並顯示一個空文檔(顯示docx時)或顯示長度不正確的文檔,並顯示gobblygook亂碼數百頁(當試圖顯示doc文件時)。
我已經嘗試過使用一系列不同的標題選項,大多數使用不同的結果,沒有使用所需的選項。那麼,如何才能成功地以可理解的格式吐出文件?
編輯由於達倫下面提供的鏈接,我現在用這個作爲我的代碼查看存儲在數據庫中的文件:
try {
$stmt = $conn->prepare("SELECT * FROM $database.users WHERE uID = :uid");
$stmt->bindParam(':uid', $uID, PDO::PARAM_INT, 11);
$stmt->execute();
$uRes = $stmt->fetchAll();
} catch(PDOException $e) { catchMySQLerror($e->getMessage()); }
$ctoken = $_COOKIE['cookieToken'];
$utoken = $uRes[0]['sessionToken'];
if($ctoken !== $utoken) {
// Our tokens don't match, kill the session
header("Location: ./logOut.php");
exit;
} else if($ctoken === $utoken) {
// Our tokens match, proceed with the view
$stmt = $conn->prepare("SELECT fileMime, fileSize, fileName, file FROM $database.appFiles WHERE fileID = :fileid");
$stmt->bindParam(':fileid', $_GET['fid'], PDO::PARAM_INT, 11);
$stmt->execute();
$fRes = $stmt->fetchAll();
header("Content-Type: application/octet-stream");
header("Content-Transfer-Encoding: Binary");
header("Content-disposition: attachment; filename=\"".$fRes[0][fileName]."\"");
echo readfile($fRes[0][file]);
exit;
}
他們現在至少出現提示我下載並保存它們,或者用正確的查看器打開它們。這很好。然而,每次文件到達只有0字節時,仍然有些錯誤...任何人都有一個概念如何解決這個問題並使其工作正常,最後?
SECOND EDIT我對這種情況做了很多測試,發現從數據庫中檢索文件實際上沒有問題。看起來好像我的上傳系統有問題,並且文件在某處出現了創傷。如果我使用phpmyadmin將上載的文件(名稱,類型,大小等全部正確導入)替換爲原始文件,將其「重新加載」到數據庫中,然後按照下載界面的要求完全處理它。在這裏學習的教訓 - 不要以爲這個文件看起來像大小,MIME,名稱等所有屬性都正確上傳!我們發現爲什麼/在我的上傳搞亂文件....如果你可能有一個想法在哪裏,爲什麼發生這種情況,請visit here
您可能想閱讀[this](http://stackoverflow.com/a/7263943/2518525),其中概述瞭如何強制下載。 – Darren
'file'列包含什麼?如果是文件內容,那麼你只需要回顯它。如果它是一個文件的路徑,那麼你只需要調用'readfile'(不帶回聲)。 – hynner
你好,hynner。該文件本身存儲在MySQL數據庫中作爲中等blob,並不存儲在目錄中的任何位置。所以它是從MySQL PDO請求中提取的數據的一部分,$ fRes [0] [file]是(應該是)文件本身。 – Cassandra