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