读取文件无法正常工作

Posted

技术标签:

【中文标题】读取文件无法正常工作【英文标题】:readfile not working properly 【发布时间】:2009-12-07 17:47:58 【问题描述】:

我正在尝试通过我的服务器通过流式下载将文件下载给我。

这是我的脚本:

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=http://user:pass@example.com/file.bin';
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . $r[2]);
ob_clean();
flush();
readfile($fileName);
exit;

example.com 不是我真正使用的,我只是不想显示真实的 URL。 :) 当我在网络浏览器中访问此文件时,没有出现下载提示,也没有任何反应。 $r[2] 是文件的内容长度(以字节为单位),$fileName 是附件标头中使用的相同 URL。我真的不知道我做错了什么。

【问题讨论】:

我不明白您提供使用用户名和密码 (?!?!?!) 作为下载文件名的绝对 URL 背后的原因。需要详细说明吗? @Joseph:标签不属于主题 【参考方案1】:

readfile();需要机器上文件的绝对路径而不是url。

例如/home/person/file.exe

【讨论】:

嗨,我已经尝试过了,当我用本地文件测试它时,脚本仍然无法工作。即使这确实有效,我仍然有使用 readfile() 打开 URL 的问题,不是吗? php.net 说这个函数接受一个 URL,但我不能让它工作。感谢您的回复。 来自 php 函数页面 “如果 fopen 包装器已启用,则 URL 可用作此函数的文件名。有关如何指定文件名的更多详细信息,请参阅 fopen()。请参阅列表支持的协议/包装器的链接,用于链接到有关各种包装器具有哪些功能的信息、有关其使用的说明以及有关它们可能提供的任何预定义变量的信息。”【参考方案2】:

文件名标题行末尾缺少),但我假设在编辑该行时发生了这种情况。

对于它的价值,运行您的示例代码会给出下载提示,除此之外还没有真正对其进行过测试,但可能与服务器/客户端配置有关,而不是代码。

【讨论】:

【参考方案3】:

恕我直言,问题是文件大小,尝试通过 http 获取文件大小(查看此函数): http://codesnippets.joyent.com/posts/show/1214

所以编辑自

header('Content-Length: ' . $r[2]);

header('Content-Length: ' . get_remote_file_size($fileurl) );

希望你能解决你的问题。

【讨论】:

【参考方案4】:

例如,我找到了一种下载图像的方法,但这对任何类型的文件都有帮助。它在不使用readfile 的情况下下载文件。

我知道这可能很笨拙,但有时我们需要一些变通方法来完成工作。

试试这个,$src = 'http://external-server/remote-image.jpg'

$url_stuff = parse_url($src); 
$port = isset($url_stuff['port']) ? $url_stuff['port'] : 80; 
$fp = fsockopen($url_stuff['host'], $port); 
$query  = 'GET ' . $url_stuff['path'] . " HTTP/1.0\n"; 
$query .= 'Host: ' . $url_stuff['host']; 
$query .= "\n\n"; 
$buffer=null;
fwrite($fp, $query); 
while ($tmp = fread($fp, 1024)) 
 
    $buffer .= $tmp; 
 

preg_match('/Content-Length: ([0-9]+)/', $buffer, $parts); 
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=your_file.bin');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');

$content = substr($buffer, - $parts[1]); 
echo $content;

这是经过测试和工作的;-)

【讨论】:

以上是关于读取文件无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

将文件读取到项目中无法正常工作的字节

NSFileManager:无法正常工作

PHP 无法从 NFS 共享读取会话

重新加载时无法读取 vue 文件

无法使用 ImageIO.read(文件文件)读取 JPEG 图像

无法读取输入文件:使用 DBStorage 将猪存储到 MYSQL