【问题标题】:PHP Download not working with path coming from DBPHP下载不适用于来自数据库的路径
【发布时间】:2012-11-22 12:40:55
【问题描述】:

我有一个简单的表单,当回传时,它会调用一个函数来启动下载。路径和文件名是从数据库中提取的,然后我使用标题开始下载。我的下载代码是:

//START DOWNLOAD
header('Content-type: "application/octet-stream"');
header('Content-Disposition: attachment; filename="'.$FILE_PATH.$FILE_NAME.'"');
header("Content-Transfer-Encoding: binary");
header("Connection: close") 

在上面的示例中,$FILE_PATH 变量是 /downloads/software/,$FILE_NAME 变量是 client-installer.exe。所以,我希望下载一个名为 client-installer.exe(大约 70MB)的文件到客户端。相反,我得到一个名为 _downloads_software_client-installer.exe 的文件,大小约为 10KB。

我想也许我需要对文件路径/名称进行 urlencode,但这也不能解决问题。所以我在想,也许我的标题有问题,但似乎找不到。

谢谢!

【问题讨论】:

  • 请移除 Content-Transfer-Encoding。它在 HTTP 中不存在。

标签: php download content-type content-disposition


【解决方案1】:

文件名标题只是表示文件应该被调用。它必须只包含一个文件名,而不是一个路径。服务器硬盘上的内部路径与客户端无关,也不感兴趣。您的服务器必须在响应中输出实际的文件数据,客户端无法从给定路径的服务器中获取它。

readfile

【讨论】:

  • 感谢@deceze 的快速回复。有道理,所以我实现了这段代码:` $file = $FILE_PATH.$FILE_NAME; header('内容描述:文件传输'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='.basename($file)); header('内容传输编码:二进制'); header('过期时间:0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('内容长度:' .filesize($file)); ob_clean();冲洗(); readfile($file);` 现在客户端上显示了正确的文件名,但它仍然是 10KB。
  • 您是否尝试过在文本编辑器中打开文件?也许它包含有用的错误消息?
  • 我是个白痴 - 我忘记了文件路径中的子目录。添加了这一点,我上面评论中的代码现在正在运行。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-29
  • 1970-01-01
相关资源
最近更新 更多