2016-10-27 1 views
-1

Как определить, является ли URL-адрес ZIP, но не загрузив весь URL-адрес сначала, потому что он может быть слишком большим? Могу ли я каким-то образом получить всего несколько байт и проверить заголовок ZIP?Проверьте, является ли URL-адрес zip

+2

Проверка почтового индекса наиболее безопасна. quick/dirty будет делать запрос HEAD и видеть, является ли тип содержимого application/zip –

+0

. Вы можете использовать 'CURLOPT_RANGE', чтобы указать диапазон байтов для загрузки. Поэтому укажите что-то вроде '0-64', чтобы получить первые 64 байта файла. Но см. Http://stackoverflow.com/questions/6048158/alternative-to-curlopt-range-to-grab-a-specific-section – Barmar

ответ

1

Я адаптировал свой код от this answer вместо того, чтобы вместо этого читать 4 байта ответа (используя либо диапазон, либо прерывая после чтения 4 байта), а затем посмотреть, соответствуют ли 4 байта заголовку магии zip.

Дайте мне попробовать и дайте мне знать результаты. Вероятно, вы захотите добавить некоторую проверку ошибок, чтобы определить, невозможно ли определить тип файла, если запрос на завивание не удалось по той или иной причине.

<?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')); 
Смежные вопросы