我无法将我成功上传的文件放在我的MySQL数据库中名为appFiles的表中的blob字段中,以便返回并显示。我已经阅读了很多演示,大多数都是相似的,但没有一个能解决我的问题。我很久以前就已经完成了这个,但是那个旧项目的代码是用mysqli完成的,我想成为100%基于PDO的。以下是我处理文件的代码部分:
} 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文件时)。
我已尝试使用一系列不同的标题选项,大多数结果不同,没有所需标题。那么如何让它成功地以可理解的格式吐出文件?
编辑感谢Darren在下面提供的链接,我现在使用它作为查看数据库中存储的文件的代码:
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个字节时,仍然有一些错误...任何人都有一个想法如何解决这个问题,并使其工作正常,最后?
第二次编辑我已经对这种情况进行了大量测试,并发现从数据库中检索文件实际上根本就没有问题。好像我的上传系统出现了问题,文件在某种程度上受到了创伤。如果我用原始文件替换上传的文件(名称,类型,大小等都正确导入),使用phpmyadmin来重新加载"它进入数据库,然后根据需要由下载界面完美地处理。在这里学习的课程 - 不要只是因为文件看起来正确的所有属性,如大小,哑剧,名称等,它是正确上传的!现在来发现我上传文件的原因/位置......如果您可能知道这种情况发生的地点或原因,请visit here
答案 0 :(得分:0)
只需替换
echo readfile($fRes[0][file]);
通过
echo $fRes[0][file];
根据您的代码,字段file
包含文件内容。因此,您只需echo
它。