Как определить, является ли URL-адрес ZIP, но не загрузив весь URL-адрес сначала, потому что он может быть слишком большим? Могу ли я каким-то образом получить всего несколько байт и проверить заголовок ZIP?Проверьте, является ли URL-адрес zip
-1
A
ответ
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'));
Смежные вопросы
- 1. Проверьте, является ли объект
- 2. Проверьте, защищен ли пароль Zip-файла
- 3. Проверьте, является ли класс полиморфным
- 4. Проверьте, является ли фрагментирован Выбором
- 5. Проверьте, является ли значение классом?
- 6. Проверьте, является ли процесс плагином
- 7. проверьте, является ли символ char
- 8. Проверьте, является ли число простым?
- 9. FormCollection Проверьте, является ли Null
- 10. Проверьте, является ли номер автоморфным
- 11. Проверьте, является ли это нулевым
- 12. Проверьте, является ли строка палиндром
- 13. Проверьте, является ли переменная массивом
- 14. Проверьте, является ли PsiElement строкой
- 15. Проверьте, является ли строка числом
- 16. Проверьте, является ли файл изображения
- 17. Проверьте, является ли файл двоичным
- 18. Проверьте, является ли переменная пуста
- 19. Проверьте, является ли пользователь root
- 20. Проверьте, является ли тип TypeBuilder
- 21. Проверьте, является ли выражение функцией?
- 22. Проверьте, является ли строка палиндром
- 23. Проверьте, является ли слово палиндром
- 24. Проверьте, является ли строка равным '*'
- 25. Проверьте, является ли time_t нулевым
- 26. Проверьте, является ли изображение JPEG
- 27. Проверьте, является ли шрифт моноширинным
- 28. Проверьте, является ли курсор видимым
- 29. Проверьте, является ли ввод целочисленным
- 30. Проверьте, является ли объект UIKeyboard
Проверка почтового индекса наиболее безопасна. quick/dirty будет делать запрос HEAD и видеть, является ли тип содержимого application/zip –
. Вы можете использовать 'CURLOPT_RANGE', чтобы указать диапазон байтов для загрузки. Поэтому укажите что-то вроде '0-64', чтобы получить первые 64 байта файла. Но см. Http://stackoverflow.com/questions/6048158/alternative-to-curlopt-range-to-grab-a-specific-section – Barmar