PHP绝对路径下的filesize

3
我很惊讶PHP的filesize()在绝对路径上失败了?? 我的文件在我的服务器上,除了将它们转换为相对路径之外,我如何获取文件大小(一团糟)? 编辑 例子:
$filename = 'http://172.16.xx.x/app/albums/002140/tn/020.jpg';
echo $filename . ': ' . filesize($filename) . ' bytes';

Warning: filesize() [function.filesize]: stat failed for http://172.16.xx.x/app/albums/002140/tn/020.jpg in /Applications/XAMPP/xamppfiles/htdocs/app/admin/+tests/filesize.php on line 26

结束编辑

我找到了这个远程文件的示例:

$filename = 'http://www.google.com/logos/2010/stevenson10-hp.jpg';
$headers = get_headers($filename, 1);
echo $headers['Content-Length']; // size in bytes

这个能在不下载文件的情况下工作吗?


如果您提供文件系统 URL 而不是 HTTP URL,它就可以正常工作。PHP 怎么知道如何将上述 URL 解析为您本地的文件系统呢? - Oliver Charlesworth
我从未听说过使用绝对路径会有问题,也从未遇到过这种情况。您使用的是哪个操作系统?能否给出一个代码示例,说明哪里出了问题? - JAL
嗯,现在我想起来了,是的,我明白了。可怜的 PHP... - FFish
@Alex 我在使用XAMPP的OSX上无法运行。我会尝试在线运行。 - FFish
7个回答

5
http://172.16.xx.x/app/albums/002140/tn/020.jpg 不是绝对路径,而是一个URL。它的绝对路径应该类似于 /var/www/app/albums/002140/tn/020.jpg。你应该在 filesize() 中使用这个绝对路径。 filesize() 只支持支持 stat() 的 URL 封装器。HTTP 和 HTTPS 不支持,正如 HTTP 和 HTTPS 封装器 手册中所述。

2
您可以像这样使用...通过URL获取文件大小
$ch = curl_init('http://172.16.xx.x/app/albums/002140/tn/020.jpg');
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
 curl_setopt($ch, CURLOPT_HEADER, TRUE);
 curl_setopt($ch, CURLOPT_NOBODY, TRUE);
 $data = curl_exec($ch);
 $size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);

 curl_close($ch);
 echo $size;

2
是的,它会很好地工作。
$filename = 'http://172.16.xx.x/app/albums/002140/tn/020.jpg';

$headers  = get_headers($filename, 1);

$fsize    = $headers['Content-Length'];

1

1

正如我所怀疑的那样,您试图将HTTP URL提供给filesize(),这是行不通的。filesize()适用于本地文件系统URL,例如在http://www.php.net/manual/en/wrappers.file.php中列出的URL。

假设您正在尝试访问自己服务器上的文件,则必须具有文件系统URL,而不仅仅是HTTP URL?


@FFish:它可以使用绝对路径,但必须是文件系统路径。 - Oliver Charlesworth

0

get_headers()会向您的服务器发送GET请求,这会增加您的Web服务器的负载。

我不明白,您的filesize()在绝对路径上失败了吗?它不应该。根据php.net: http://www.php.net/manual/en/wrappers.file.php

编辑: 如果allow_url_fopen设置为0,我不确定PHP会给您什么错误,但请检查您的PHP.ini中的此行(然后重新启动Apache):http://www.php.net/manual/en/filesystem.configuration.php#ini.allow-url-fopen

如果关闭,filesize()将无法处理URL。如果是这个问题,请告诉我。


-3

@FFish:你需要提供一个具体的代码示例,说明它为什么不能工作。 - Oliver Charlesworth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接