今日免费次数已满, 请开通会员/明日再来

9

图片和脚本都托管在同一个账户(一个网站)上,但我们只知道图片的URL。

$image = "http://example.com/images/full-1091.jpg"

我们如何获取此文件的大小?
伪代码:
{ do something with $image and get $image_size }
echo $image_size;

我希望$image_size的格式能够以人类可读的文件大小表示,例如“156.8千字节”或“20.1兆字节”。
5个回答

30

可以像这样使用filesize函数:

echo filesize($filename) . ' bytes';

你也可以使用这个函数来格式化大小的单位:

function format_size($size) {
      $sizes = array(" Bytes", " KB", " MB", " GB", " TB", " PB", " EB", " ZB", " YB");
      if ($size == 0) { return('n/a'); } else {
      return (round($size/pow(1024, ($i = floor(log($size, 1024)))), 2) . $sizes[$i]); }
}

只是为了严谨起见,这个答案延续了十进制和二进制倍数缩写的混淆。一个兆字节是1,000,000字节还是1,048,576字节?https://en.wikipedia.org/wiki/Binary_prefix 我建议要么将$sizes更改为array(" Bytes", " KiB", " MiB", " GiB", " TiB", " PiB", " EiB", " ZiB", " YiB"),要么将1024的两个出现更改为1000。 - RenniePet

3

图片和脚本托管在同一账户(一个网站)。

那么不要使用URL:使用直接的文件路径和 filesize() 函数。


我认为对于与同一服务器本地文件而言,这是正确的解决方案;因为通过url查找文件的解决方案相当难看且冗长,所以它只应该用于远程文件:http://www.php.net/manual/en/function.filesize.php#92462 - Ashaman

3

0
 echo filesize($_SERVER['DOCUMENT_ROOT']."/images/full-1091.jpg");

请注意,http://site.com/images/full-1091.jpg不是文件。
至于格式化输出(“156,8 Kbytes”或“20,1 Mbytes”),请尝试自行搜索。这个问题已经有很多答案了。

@Pekka使用文件路径是指“使用$_SERVER['DOCUMENT_ROOT']”吗? - James
@Ignatz 这是一个选项 - 或者使用硬编码的完整路径 (/path/to/folder/images/image.jpg)。 - Pekka

-4
<?php
  $contents=file_get_contents("http://site.com/images/full-1091.jpg");
   // var_dump($contents);
//  $fp =fopen("1.jpeg","w");
  file_put_contents("1.jpeg",$contents);
  $size= filesize("1.jpeg");
  echo $size."in Bytes";
  ?>

请检查一下,它可能适合您的需求


2
老兄,这是我见过的最丑陋的解决方案。 - Your Common Sense
如果PHP代码运行的服务器与http://site.com不同,那么该解决方案将是正确的(除了将内容保存在1.jpeg中,并尝试获取1.gif文件的文件大小)。如果PHP代码也在http://site.com上运行,则应直接调用`filesize()`并传递图像文件路径。由于OP没有报告PHP代码是否在包含图像的同一服务器上运行,因此此解决方案也是有效的。 - apaderno
@kiamlaluno 你看不懂。图片和脚本托管在同一个帐户上。(一个网站)。 你最好把你的爱好限制在科幻小说上。 - Your Common Sense
Shrapnel上校:我戴着眼镜,你为什么要用“试着自己搜索一下”来回答问题呢?如果我们不是在谈论通过HTTP协议访问的资源,那么文件不是文件的争论就没有完全意义。 - apaderno
@kiam 在这里:http://stackoverflow.com/faq 在提问之前,请先查看一下是否已经有人问过(或者甚至已经回答了)你的问题。 说到问题,一个开发者如果连什么是文件都不知道,那就一无是处了。理解基本原理比会复制粘贴别人在SO上写给你的代码片段更重要。对于大多数SO用户来说,编程是为了什么。 - Your Common Sense
我不知道OP是否理解什么是文件;我唯一能说的是,使用http://example.com/filename.extension访问服务器上的本地文件是没有意义的。我认为提问者应该得到一个解释,说明他为什么在做错事;仅仅说这是错误的,而不详细解释为什么是错误的,就像复制代码片段而不知道它的作用一样。 - apaderno

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