2015-04-07 68 views
1

我無法讓位於我的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

+0

您可能想閱讀[this](http://stackoverflow.com/a/7263943/2518525),其中概述瞭如何強制下載。 – Darren

+0

'file'列包含什麼?如果是文件內容,那麼你只需要回顯它。如果它是一個文件的路徑,那麼你只需要調用'readfile'(不帶回聲)。 – hynner

+0

你好,hynner。該文件本身存儲在MySQL數據庫中作爲中等blob,並不存儲在目錄中的任何位置。所以它是從MySQL PDO請求中提取的數據的一部分,$ fRes [0] [file]是(應該是)文件本身。 – Cassandra

回答

0

只需更換

echo readfile($fRes[0][file]); 

通過

echo $fRes[0][file]; 

根據您的代碼,字段file包含文件內容。所以你只需echo吧。

+0

嗨洛倫茲,請檢查我上面最近的評論 - 我已經完成了你提名的內容,但它不起作用。 – Cassandra

+0

那麼告訴我:數據庫中的文件內容在哪裏? –

+0

文件內容存儲在一個單獨的表中,專門用於文件收集和處理,位於設置爲medum blob(文件大小限制爲5Mb,最大值)的字段中。該字段具有BINARY屬性。沒有其他特殊屬性設置在它上面。 – Cassandra

相關問題