2015-04-07 71 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

相关问题