Php getimagesize()限制远程URL的文件大小

Php getimagesize()限制远程URL的文件大小,php,validation,getimagesize,Php,Validation,Getimagesize,我可以用它来验证一个映像,但问题是,如果淘气的用户将一个链接放在一个服务器上,那么它会破坏我的生产服务器的带宽。如何限制getimagesize()获取的文件大小?(例如,最大图像大小为5MB) PS:我在问之前问过。你不想做类似于getimagesize(getimagesize”)的事情http://example.com)首先,由于这将下载一次图像,请检查大小,然后丢弃下载的图像数据。那真是浪费带宽 因此,将下载过程与检查图像大小分开。例如,使用fopen打开图像URL,一点一点地读取并将

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


PS:我在问之前问过。

你不想做类似于
getimagesize(
getimagesize”)的事情http://example.com)
首先,由于这将下载一次图像,请检查大小,然后丢弃下载的图像数据。那真是浪费带宽

因此,将下载过程与检查图像大小分开。例如,使用
fopen
打开图像URL,一点一点地读取并将其写入一个临时文件,计算您已读取的内容。一旦您跨过5MB并且仍然没有完成读取,您将停止并拒绝该图像


在开始实际下载之前,您可以尝试读取HTTP内容大小标题,以清除明显较大的文件,但您不能依赖它,因为它可能会被欺骗或忽略。

您不想执行类似于
getimagesize('s)的操作http://example.com)
首先,由于这将下载一次图像,请检查大小,然后丢弃下载的图像数据。那真是浪费带宽

因此,将下载过程与检查图像大小分开。例如,使用
fopen
打开图像URL,一点一点地读取并将其写入一个临时文件,计算您已读取的内容。一旦您跨过5MB并且仍然没有完成读取,您将停止并拒绝该图像

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

这里有一个例子,您需要进行一些更改以满足您的要求

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;
}
函数getimagesize\u limit($url,$limit) { 全局$phpbb_根路径; $tmpfilename=tempnam($phpbb_root_path.'store/',unique_id().-'); $fp=fopen($url,'r'); 如果(!$fp)返回false; $tmpfile=fopen($tmpfilename,'w'); $size=0; 虽然(!feof($fp)&&$size这里有一个,但您需要进行一些更改以满足您的需求

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;
}
函数getimagesize\u limit($url,$limit) { 全局$phpbb_根路径; $tmpfilename=tempnam($phpbb_root_path.'store/',unique_id().-'); $fp=fopen($url,'r'); 如果(!$fp)返回false; $tmpfile=fopen($tmpfilename,'w'); $size=0;
当(!feof($fp)&&$size时,您可以单独下载该文件,并设置您希望下载的最大大小:

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;
}

您可以单独下载该文件,并设定要下载的最大大小:

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;
}


也许这适合你的用例也许这适合你的用例我可以问你为什么要添加
8192
?@Severus这只是意味着一次读取8kb,没有特殊意义。这是在phpbb实现的哪个文件?我可以问你为什么要添加
8192
?@Severus这只是意味着一次读取8kb,没有特殊意义。这是在phpbb实现的哪个文件?Hi、 如果我有100个用户同时上传,我的
stream\u copy\u to\u stream
不会有内存问题吗?@Severus你会怎么想?我相信它内部使用8K缓冲区来执行复制。@Severus你能更具体一点吗?:)那么当达到限制时,我怎么抛出异常呢?@Severus stream\u copy\u to\u stream()返回复制的字节,以便您可以检查该数字是否等于$max_sizeHi,如果我有100个用户同时上传,我的
stream_copy_to_stream
是否会出现内存问题?@Severus您会怎么想?在内部,我相信它使用8K缓冲区来执行复制。@Severus您能更具体一点吗?:)那么,当达到限制时,我将如何抛出异常?@Severus stream\u copy\u to\u stream()返回复制的字节,以便您可以检查该数字是否等于$max\u size