【问题标题】:Download issue in php在php中下载问题
【发布时间】:2013-10-03 19:53:50
【问题描述】:

我有一个用于下载 mp4 视频文件的 php 脚本。它现在可以正常处理小文件(测试最大 60 MB)。当我尝试一个大的(300 MB)时,它显示与“内存限制”相关的错误。因此,在 ini 文件中进行了一些编辑,以将内存限制增加到 400 MB (memory_limit = 400M)。然后我尝试运行我的脚本,但下载框显示的内容大小为 189 字节。我用另一个 mp4 文件(小尺寸)试了一下,效果很好。我不明白它的原因。所以请指导我。我的脚本如下..

$file = $_SERVER['DOCUMENT_ROOT']."/folder_name/filename.mp4";
$filesize = filesize($file);
$fileName=$file;
$offset = 0;
$length = $filesize;

if ( isset($_SERVER['HTTP_RANGE']) ) {

    $partialContent = true;

    preg_match('/bytes=(\d+)-?/', $_SERVER['HTTP_RANGE'], $matches);

    $offset = intval($matches[1]);
    $length = $filesize - $offset;
}else {
    $partialContent = false;
}

$file = fopen($file, 'r');

fseek($file, $offset);

$data = fread($file, $length);

fclose($file);

if ( $partialContent ) {

    header('HTTP/1.1 206 Partial Content');

    header('Content-Range: bytes ' . $offset . '-' . ($offset + $length) . '/' . $filesize);
}

header("Content-type: video/mp4");
header('Content-Length: ' . $filesize);
header('Content-Disposition: attachment; filename="' . $fileName . '"');
header('Accept-Ranges: bytes');
print($data);

显示的下载框是..

【问题讨论】:

  • 如果它显示的内容大小为 189 字节,则该脚本可能出错并且该文件的内容可能是该错误的文本,请在文本编辑器中打开该文件并查看。
  • 尝试`ini_set('memory_limit', '300M'); ` 但是,如果您不需要进行任何类型的验证,为什么不将 mp4 文件放在一个目录中,让用户直接从服务器下载?
  • @Patrick Evans:非常感谢。正如您所说,出现“已用尽 *** 字节的允许内存大小”的错误。所以我在脚本中添加了一行代码(ini_set('memory_limit','-1'))。现在 pblm 已解决..非常感谢.. :)

标签: php download


【解决方案1】:

请在您的服务器不支持为您的脚本分配这么多内存时与您的服务器联系。

请在脚本顶部添加以下行。

ini_set('memory_limit', '-1');
ini_set('max_execution_time', '0');

如果这不起作用,请告诉我。

【讨论】:

  • 不好。 PHP 默认使用这些指令来防止过度使用内存。不要删除这些限制,否则服务器会非常消耗内存。
【解决方案2】:

没有充分理由更改所有指令是不好的,所以第一步是要知道你有什么具体问题。

当您运行用于下载文件的脚本时,例如在本例中为 mp4 视频文件,并且下载框显示的内容大小比实际文件小得多,很容易找出问题所在:

你只需要下载那个文件,不管它看起来像视频,用文本编辑器打开它。

右键单击 > 打开方式...,然后选择任何文本编辑器。

你会发现文件的实际内容是关于服务器发生错误的信息。有了这个,您将更好地了解发生了什么,因此您可以弄清楚它是否与 memory_limit、max_execution_time 或任何其他原因有关。

现在您可以决定更改一个或多个指令,或者可能更改您的脚本以获得更好的性能。

注意:如果您下载的文件是空的,或者不包含任何错误信息,则可能您禁用了错误报告。要启用它,您可以在脚本开头添加这两行:

ini_set("display_errors","1");
error_reporting(E_ALL);

【讨论】:

  • 你应该清理这个答案,包括单词选择/句子结构,并尽可能提供代码示例。
  • 我什至不确定这个答案与所提出的问题有什么关系。当然,这并不能反映对问题的良好把握或已经尝试和看到的内容。
  • 谢谢 Nathaniel,我会努力提高我的写作水平。安德鲁,对不起,我解释得太糟糕了,你甚至不知道它是否与问题有关。是的,让我编辑它以解释我想说的话。我是 stackoverflow 的新手,我想提供帮助,所以所有这些 cmets 都很受欢迎。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
  • 2014-07-31
  • 2023-04-10
  • 2013-11-02
相关资源
最近更新 更多