【发布时间】:2016-04-08 08:14:28
【问题描述】:
我目前正在开发一个从 MSSQL 数据库中提取文件的实用程序。文件的主体以 base64 字符串的形式存储在数据库中,我正在使用 PHP 函数 base64_decode() 对其进行解码。要在页面打开时开始下载文件,我使用的是标题:
$filename = $file[0][0];
$file_body = base64_decode( $file[0][1] );
$size = $file[0][2];
$type = $file[0][3];
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Description: File Transfer");
header("Content-Length: $size;");
header("Content-Disposition: attachment; filename=$filename");
header("Content-Type: $type ");
header("Content-Transfer-Encoding: binary");
echo $file_body;
文件下载,一切正常,直到文件大小超过 48kb。之后只下载了 48kb 的文件。我已经使用许多文件类型进行了测试,但结果仍然相同。根据我在网上找到的其他帖子的建议,我在 php.ini 中增加了 php 内存和帖子大小,但仍然没有运气。
我意识到 PHP 可能不是完成此任务的最佳方式,但是,这是我可以使用的。
有什么想法可以确保始终下载完整的文件吗?
【问题讨论】:
-
你能分享你实际创建文件的代码以通过 php 发送它吗?
-
@JorgeCampos 已更新为请求的代码。
-
你是否在运行 error_reporting(E_ALL); ?并验证解码字符串的大小实际上是否正是您所期望的。 put: if(strlen($file_body)!==$size){throw new RuntimeException("从 db! 文件损坏的数据应该是 ".$size." 字节,但只是 ".strlen($file_body). "字节!");}
-
@hanshenrik 如果我将解码后的字符串打印到屏幕上,它与我上传的内容相匹配。如果我使用从数据库中提取的文件大小,它似乎永远不会匹配字符串长度。也许它已经被四舍五入了?
-
快速浏览了一下,发现了一些可能有用的链接:stackoverflow.com/a/11316004/278763 和 php.net/manual/en/function.readfile.php。我意识到您不是在阅读文件而是在流式传输内容,但也许这些可能会有所帮助。在
echo通话后您需要flush()吗?
标签: php sql-server