我无法让位于我的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