2016-10-27 13 views
-1

Wie kann ich feststellen, ob es sich bei einer URL um eine ZIP handelt, aber ohne zuerst die gesamte URL herunterzuladen, weil sie möglicherweise zu groß ist? Kann ich irgendwie ein paar Bytes bekommen und nach einem ZIP-Header suchen?Überprüfen, ob die URL eine Postleitzahl ist

+2

Überprüfung auf Zip-Header ist am sichersten. quick/dirty würde eine HEAD-Anfrage machen und sehen, ob der Inhaltstyp application/zip ist. –

+0

Sie können 'CURLOPT_RANGE' verwenden, um den Bereich der zu downloadenden Bytes anzugeben. Geben Sie also etwas wie "0-64" an, um die ersten 64 Bytes der Datei zu erhalten. Aber siehe http://stackoverflow.com/questions/6048158/alternative-to-curlopt-range-to-grab-a-specific-section – Barmar

Antwort

1

Ich habe meinen Code von this answer angepasst, um stattdessen 4 Bytes aus der Antwort zu lesen (entweder einen Bereich oder durch Abbrechen nach dem Lesen von 4 Bytes) und dann zu sehen, ob die 4 Bytes dem zip magic Header entsprechen.

Probieren Sie es aus und lassen Sie mich die Ergebnisse wissen. Wahrscheinlich möchten Sie eine Fehlerüberprüfung hinzufügen, um festzustellen, ob der Dateityp nicht ermittelt werden konnte, wenn die CURL-Anforderung aus dem einen oder anderen Grund fehlgeschlagen ist.

<?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')); 
Verwandte Themen