Php: if (file_exists ($ file)) возвращает true для одних файлов, false для других

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

Вы добавляете этот файл? Иногда у меня возникали проблемы, когда вам нужно очистить кеш статистики, используя: php.net/manual/en/function.clearstatcache.php, но я не могу сказать, что это будет ваша проблема.

dgig 21.05.2018 23:12

Где вы размещаете свой сайт? Если он размещен на машине UNIX, файлы чувствительны к регистру. Если вы не можете перемещаться туда вручную, это хороший признак того, что вы, вероятно, действительно загрузили файл с другим расширением.

Obsidian Age 21.05.2018 23:13
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 ГБ создают проблемы.
user3783243 21.05.2018 23:17
header('X-Sendfile: $file'); должен быть header("X-Sendfile: $file");
Jaime 22.05.2018 00:40

он может выдать E_WARNING с некоторым объяснением

Deadooshka 22.05.2018 03:15

Я думаю, что @ user3783243 попал в точку. Я прочитал эту страницу, специально ища проблему, и, очевидно, прочитал прямо над этой заметкой. (Думаю, я, наверное, зациклился на том, было ли это красное примечание об ограничениях безопасного режима.)

zee 22.05.2018 15:24
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
6
811
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

на основе комментария @ 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.

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

поэтому я написал свою собственную функцию 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 ().

Другие вопросы по теме