Php 检查URL是否为zip
我如何确定一个URL是否为ZIP,但不首先下载整个URL,因为它可能太大?我是否可以只获取几个字节并检查ZIP头?我将我的代码从中修改为从响应中读取4个字节(使用范围,或在读取4个字节后中止),然后查看4个字节是否与ZIP头匹配 试试看,让我知道结果。您可能需要添加一些错误检查,以查看如果curl请求由于某种原因失败,是否无法确定文件的类型Php 检查URL是否为zip,php,http,curl,zip,Php,Http,Curl,Zip,我如何确定一个URL是否为ZIP,但不首先下载整个URL,因为它可能太大?我是否可以只获取几个字节并检查ZIP头?我将我的代码从中修改为从响应中读取4个字节(使用范围,或在读取4个字节后中止),然后查看4个字节是否与ZIP头匹配 试试看,让我知道结果。您可能需要添加一些错误检查,以查看如果curl请求由于某种原因失败,是否无法确定文件的类型 <?php /** * Try to determine if a remote file is a zip by making an HTTP
<?php
/**
* Try to determine if a remote file is a zip by making an HTTP request for
* a byte range or aborting the transfer after reading 4 bytes.
*
* @return bool true if the remote file is a zip, false otherwise
*/
function isRemoteFileZip($url)
{
$ch = curl_init($url);
$headers = array(
'Range: bytes=0-4',
'Connection: close',
);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2450.0 Iron/46.0.2450.0');
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_VERBOSE, 0); // set to 1 to debug
curl_setopt($ch, CURLOPT_STDERR, fopen('php://output', 'r'));
$header = '';
// write function that receives data from the response
// aborts the transfer after reading 4 bytes of data
curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($curl, $data) use(&$header) {
$header .= $data;
if (strlen($header) < 4) return strlen($data);
return 0; // abort transfer
});
$result = curl_exec($ch);
$info = curl_getinfo($ch);
// check for the zip magic header, return true if match, false otherwise
return preg_match('/^PK(?:\x03\x04|\x05\x06|0x07\x08)/', $header);
}
var_dump(isRemoteFileZip('https://example.com/file.zip'));
var_dump(isRemoteFileZip('https://example.com/logo.png'));
检查zip头是最安全的。quick/dirty将执行HEAD请求,并查看内容类型是否为application/zipy您可以使用CURLOPT_RANGE
指定要下载的字节范围。因此,指定类似于0-64
的内容来获取文件的前64个字节。但是看到了吗