я в тупике. Я собираю сценарий, чтобы взять PATH_INFO из URL-адреса и использовать его для отправки файлов из определенного каталога на сервере.
на сервере:
ll /path/to/directory/with/my/files/
total 7195210
-rwxrwx--- 1 user group 716852833 May 11 15:17 file1.7z
-rwxrwx--- 1 user group 1000509440 May 11 15:31 file2.cxarchive
-rwxrwx--- 1 user group 5878056960 May 11 17:32 file3.ISO
У меня есть блок if (file_exists($file) в моем коде, и он работает для file1 и file2, но file3, это в том же месте, он запускает оператор else, указывая на то, что PHP считает, что этот файл не существует.
<?php
//get file name from URL, trim leading slash.
$filename = ltrim($_SERVER['PATH_INFO'], "/");
//sanitize the filename
if (preg_match('/\.\.|[<>&~;`/$]/', $filename)) {
trigger_error("Invalid path '$filename' attempted by $user");
show_error();
}
//prepend my files directory to the filename.
$file = '/path/to/directory/with/my/files/' . $filename;
//send file
if (file_exists($file)) {
echo '<pre>The file '; print_r($file); echo ' exists.</pre>';
header('X-Sendfile: $file');
exit;
} else {
echo '<pre>the file does not exist?</pre>';
show_error();
}
?>
поэтому, если я перейду к следующим URL-адресам на моем сервере:
https://my.server.com/script.php/file1.7z
Файл file1.7z существует.
https://my.server.com/script.php/file2.cxarchive
Файл file2.cxarchive существует.
https://my.server.com/script.php/file3.ISO
Файл не существует?
ряд тестов приводит к тому, что вероятная причина заключается в том, что файл большой. Я понимаю, что при отправке файлов ограничения памяти являются проблемой, но как мне заставить PHP увидеть, что этот (большой) файл существует?
Где вы размещаете свой сайт? Если он размещен на машине UNIX, файлы чувствительны к регистру. Если вы не можете перемещаться туда вручную, это хороший признак того, что вы, вероятно, действительно загрузили файл с другим расширением.
Because PHP's integer type is signed and many platforms use 32bit integers, some filesystem functions may return unexpected results for files which are larger than 2GB. -php.net/manual/en/function.file-exists.php Итак, файлы размером <2 ГБ не имеют проблем, а ваши 5 ГБ создают проблемы.
header('X-Sendfile: $file'); должен быть header("X-Sendfile: $file");он может выдать E_WARNING с некоторым объяснением
Я думаю, что @ user3783243 попал в точку. Я прочитал эту страницу, специально ища проблему, и, очевидно, прочитал прямо над этой заметкой. (Думаю, я, наверное, зациклился на том, было ли это красное примечание об ограничениях безопасного режима.)






на основе комментария @ user3783243 выше:
Because PHP's integer type is signed and many platforms use 32bit integers, some filesystem functions may return unexpected results for files which are larger than 2GB.
поэтому я написал свою собственную функцию file_exists без этого ограничения (на основе прокомментировать эту страницу):
function fileExists($file){
return (@fopen($file,"r")==true);
}
затем вставляем его в код:
//send file
if (fileExists($file)) { //remove underscore, cap E
echo '<pre>The file '; print_r($file); echo ' exists.</pre>';
header("X-Sendfile: $file"); //fixed, thanks @jamie
exit;
} else {
echo '<pre>the file does not exist?</pre>';
show_error();
}
успех! файлы, которые существуют, работают (даже большие), файлы, которые не запускают show_error ().
Вы добавляете этот файл? Иногда у меня возникали проблемы, когда вам нужно очистить кеш статистики, используя: php.net/manual/en/function.clearstatcache.php, но я не могу сказать, что это будет ваша проблема.