【问题标题】:Why file downloaded is 0 byte?为什么下载的文件是0字节?
【发布时间】:2019-08-13 23:18:18
【问题描述】:

我在用户下载 mp3 文件时触发了此代码

$file = $_GET['file'];
$ext = pathinfo($file, PATHINFO_EXTENSION);
$match_array =array('pdf','mp3','mpa','ra','wav','wma','mid','m4a','m3u','iff','aif');
if(in_array($ext,$match_array)){
  header("Content-type: application/".$ext);
  header("Content-Disposition: attachment; filename=". $file);
  readfile($file);
}

但下载的文件是 0 字节,这是什么问题?

文件存在且$file 包含此值

https://mysite/upload/1/myfile.mp3

【问题讨论】:

  • 如果您将该 URL 直接放在浏览器中,它会下载文件吗?您是否检查过您的if 语句是否有效?您是否检查过是否启用了正确的包装器以允许将 URL 作为参数放入 readFile 方法? (有关最后一个问题的说明,请参阅 php.net/manual/en/function.readfile.php
  • @ADyson 不打开/流式传输文件
  • 好的。但这至少可以确认 URL 是正确的。现在你需要检查我的另外两点
  • @ADyson 检查现在是1

标签: php


【解决方案1】:

您的问题可能是配置问题。

记住allow_url_fopen 必须在 php.ini 中为 = on From Here

另一种选择可能是使用以下代码并将其保存到本地文件系统。

$localPath = "tmp/foo.mp3";
$contents = file_get_contents($file);
$save = file_put_contents($localPath, $contents);

【讨论】:

  • 我收到此警告:警告:file_put_contents():依赖系统的时区设置是不安全的。您必须使用 date.timezone 设置或 date_default_timezone_set() 函数。如果您使用了这些方法中的任何一种,但仍然收到此警告,您很可能拼错了时区标识符。我们暂时选择了时区“UTC”,但请设置 date.timezone 以选择您的时区,似乎时区未在 php.ini 中设置
  • @Wel 将date_default_timezone_set('America/Los_Angeles'); 添加到您的文件或配置文件的顶部(如果您包含一个)。查找您自己的时区HERE
  • 我在file_put_contents中打开文件或目录失败
  • @Wel 这意味着$localPath 不正确,您必须确保将文件放入的文件夹路径正确。 /foo.mp3 应该把它放在当前工作目录中(你的脚本所在的位置)。
  • 还是 0 字节文件。是服务器问题吗?
【解决方案2】:

这是服务器问题,PHP 设置为旧 5 版本,所以当我将版本更改为 7 时,它工作正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 2019-06-16
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多