1

我可以getimagesize()用来验证图像,但问题是如果淘气的用户放置一个10GB 随机文件的链接,那么它会破坏我的生产服务器的带宽。如何限制文件大小getimagesize()?(例如,最大图像大小为 5MB)

PS:我在问之前做了研究

4

3 回答 3

2

您不想getimagesize('http://example.com')一开始就这样做,因为这将下载图像一次,检查大小,然后丢弃下载的图像数据。确实是对带宽的浪费。

因此,将下载过程与检查图像大小分开。例如,fopen用来打开图片的URL,一点一点的读,写到一个临时文件,记下你读了多少。一旦超过 5MB 并且仍未完成阅读,您将停止并拒绝该图像。

可以在开始实际下载之前尝试读取 HTTP Content-Size 标头以清除明显较大的文件,但您不能依赖它,因为它可能被欺骗或省略。

于 2012-09-03T14:53:11.707 回答
2

这是一个示例,您需要进行一些更改以满足您的要求。

function getimagesize_limit($url, $limit)
{
 global $phpbb_root_path;
 $tmpfilename = tempnam($phpbb_root_path . 'store/', unique_id() . '-');
  $fp = fopen($url, 'r');
 if (!$fp) return false; 
 $tmpfile = fopen($tmpfilename, 'w');
  $size = 0;
 while (!feof($fp) && $size<$limit)
 {
  $content = fread($fp, 8192);
  $size += 8192;  fwrite($tmpfile, $content);
 }
  fclose($fp);
 fclose($tmpfile);
  $is = getimagesize($tmpfilename);
 unlink($tmpfilename);
 return $is;
}
于 2012-09-03T14:53:52.550 回答
2

您可以单独下载文件,设置您希望下载的最大大小:

function mygetimagesize($url, $max_size = -1)
{
        // create temporary file to store data from $url
        if (false === ($tmpfname = tempnam(sys_get_temp_dir(), uniqid('mgis')))) {
                return false;
        }
        // open input and output
        if (false === ($in = fopen($url, 'rb')) || false === ($out = fopen($tmpfname, 'wb'))) {
                unlink($tmpfname);
                return false;
        }
        // copy at most $max_size bytes
        stream_copy_to_stream($in, $out, $max_size);

        // close input and output file
        fclose($in); fclose($out);

        // retrieve image information
        $info = getimagesize($tmpfname);

        // get rid of temporary file
        unlink($tmpfname);

        return $info;
}
于 2012-09-03T15:22:36.357 回答