【问题标题】:Downloaded file generated by PHP is getting cut off constistantly at about 47.2kb由 PHP 生成的下载文件在大约 47.2kb 处不断被截断
【发布时间】: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/278763php.net/manual/en/function.readfile.php。我意识到您不是在阅读文件而是在流式传输内容,但也许这些可能会有所帮助。在echo 通话后您需要flush() 吗?

标签: php sql-server


【解决方案1】:

您无需在任何地方存储长度(尺寸)。您应该通过以下方式即时计算它:

$size = strlen($file_body);
...
header("Content-Length: $size;");

【讨论】:

  • 做了这个改变,我仍然得到相同的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
  • 2012-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多