绝对路径的 PHP 文件大小

Posted

技术标签:

【中文标题】绝对路径的 PHP 文件大小【英文标题】:PHP filesize for absolute path 【发布时间】:2010-11-13 13:29:36 【问题描述】:

我很惊讶 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 解析到本地文件系统? 我从来没有听说过使用绝对路径有问题,我也从来没有遇到过。您使用的是哪个操作系统,您能否举一个不起作用的代码示例? 嗯,现在我想起来了,是的,我明白了。可怜的PHP.. @Alex 我在带有 XAMPP 的 OSX 上,它在这里不起作用。我在网上试试。 【参考方案1】:

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 and HTTPS wrappers 的手册页中提到的那样。

【讨论】:

【参考方案2】:

是的,一切都会好起来的。

$filename = 'http://172.16.xx.x/app/albums/002140/tn/020.jpg';

$headers  = get_headers($filename, 1);

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

【讨论】:

【参考方案3】:

您可以像这样使用 ... 通过 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;

【讨论】:

【参考方案4】:

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

大概,当您尝试访问自己服务器上的文件时,您必须拥有文件系统 URL,而不仅仅是 HTTP URL?

【讨论】:

@FFish:它确实适用于绝对路径,但它们必须是文件系统路径。【参考方案5】:

使用函数filesize();

你应该有绝对路径而不是网址

http://www.php.net//manual/en/function.filesize.php

【讨论】:

【参考方案6】:

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。让我知道是不是这样。

【讨论】:

【参考方案7】:

我认为你必须使用filesize() 函数。

http://php.net/manual/en/function.filesize.php

echo filesize( $filename );

【讨论】:

@FFish:您需要给出一些不起作用的代码的具体示例。

以上是关于绝对路径的 PHP 文件大小的主要内容,如果未能解决你的问题,请参考以下文章

PHP获得文件的大小并转换格式

PHP文件下载

如何在使用查找时列出没有绝对路径的目录中的所有文件及其文件大小

VC怎么通过绝对路径确定一个文件或者文件夹是不是存在,如果是文件存在,怎么获得该文件的大小

PHP 无法获取通过 Dropzone 上传的文件?

PHP中常用的常量