php: if (file_exists ($ file)) возвращает true для некоторых файлов, false для других - PullRequest
0 голосов
/ 22 мая 2018

я в тупике.Я собираю сценарий, чтобы извлечь 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

У меня есть *Блок 1006 * в моем коде, и он работает для file1 и file2, но file3, , который находится в том же месте , запускает оператор else, указывая, что PHP считает, что файл не существует.

<code><?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.
';заголовок ('X-Sendfile: $ file');выход;} else {echo '
the file does not exist?
';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 увидеть, что этот (большой) файл существует?

1 Ответ

0 голосов
/ 22 мая 2018

на основе комментария @ user3783243 выше:

Поскольку целочисленный тип PHP подписан и многие платформы используют 32-битные целые, некоторые функции файловой системы могут возвращать неожиданные результаты для файлов размером более 2 ГБ.

- https://secure.php.net/manual/en/function.file-exists.php

, поэтому я написал свою собственную функцию file_exists без этого ограничения (на основе комментария на этой странице ):

function fileExists($file){
return (@fopen($file,"r")==true);
}

затем, вставив его в код:

<code>//send file
if (fileExists($file)) {    //remove underscore, cap E
echo '<pre>The file '; print_r($file); echo ' exists.
';заголовок («X-Sendfile: $ file»);// исправлено, спасибо @jamie exit;} else {echo '
the file does not exist?
';show_error ();}

успех!существующие файлы (даже большие), файлы, которые не запускаются show_error ().

...