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
-1
A
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
- 1. Überprüfen, ob der gewählte Status die eingegebene Postleitzahl hat jQuery
- 2. Überprüfen, ob die Funktion eine Nebenstelle ist
- 3. Überprüfen Sie, ob url ist ein Bild
- 4. Überprüfen Sie, ob eine URL in Elixir gültig ist
- 5. Überprüfen Sie, ob eine Bild URL transparent ist mit PHP
- 6. Überprüfen, ob die aktuelle Anfrage-URL der Controller-Index ist
- 7. Spring Security - überprüfen, ob die Web-URL sicher/geschützt ist
- 8. So überprüfen Sie, ob die URL erreichbar ist oder nicht
- 9. Mit iOS, wie überprüfen, ob die URL leer ist
- 10. So überprüfen Sie, ob die URL ein externer Link ist
- 11. Überprüfen, ob die relative URL mit Regular Expression gültig ist?
- 12. jquery - überprüfen, ob die Abfragezeichenfolge auf der URL vorhanden ist?
- 13. PHP: Überprüfen, ob URL-Weiterleitungen?
- 14. überprüfen, ob URL existiert php
- 15. überprüfen, ob url unc Verzeichnispfad
- 16. Überprüfen, ob die aktuelle Seite eine Homepage auf Jekyll ist
- 17. Erkennen, ob eine Zeichenfolge eine URL ist
- 18. Überprüfen Sie, ob eine URL eine herunterladbare Datei bietet?
- 19. Prüfen, ob die Postleitzahl zu dem Land gehört
- 20. Überprüfen, ob ein Typ eine Karte ist
- 21. überprüfen, ob eine Datei ein Bild ist
- 22. Überprüfen, ob eine Zugangstabelle vorhanden ist
- 23. Javascript überprüfen, ob eine Dezimalzahl negativ ist
- 24. Überprüfen, ob eine Bedingung falsch ist
- 25. Überprüfen, ob es eine glückliche Nummer ist
- 26. Überprüfen, ob eine Datenreihe Zeichenfolgen ist
- 27. Überprüfen, ob eine DateTime vor DateTime.Now ist
- 28. Überprüfen, ob eine Eigenschaft vorhanden ist. Groovy
- 29. Überprüfen, ob Fenster eine MessageBox ist
- 30. Überprüfen, ob die PouchDB-Datenbank leer ist
Überprüfung auf Zip-Header ist am sichersten. quick/dirty würde eine HEAD-Anfrage machen und sehen, ob der Inhaltstyp application/zip ist. –
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