не открывается файл - Linux Debian

Arramis

Новичок
Необходимо узнать размер загружаемого на сервер файла (картинки) для его дальнейшей валидации.
Код получающий размер -
PHP:
protected function fix_integer_overflow($size)
{       
    if ($size < 0)
    {
        $size += 2.0 * (PHP_INT_MAX + 1);
    }

    return $size;
}

protected function get_file_size($file_path, $clear_stat_cache = false)
{
    if ($clear_stat_cache)
    {
        clearstatcache(true, $file_path);
    }
       
    return $this->fix_integer_overflow(filesize($file_path)); // возвращается false (
}
беда в том, что file_size возвращает false.
Пробывал fopen(), file(), и file_get_contents() ом открывать файл и руками посчитать длину символов, но все они возвращают false.

Какие могу быть причины такого поведения ?
сервер на debian, php 5.3.3
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Arramis, у тебя в $_FILES есть переменная, которая отвечает за размер, разве нет?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Arramis, какого дерьма? То, что ты написал фигню, не значит что интерпретатор работает не правильно.
 

Arramis

Новичок
Arramis, какого дерьма? То, что ты написал фигню, не значит что интерпретатор работает не правильно.
я не говорил что интерпретатор правильно не работает, и обоснуй где фигня ?
к примеру такой код работает -

PHP:
protected function fix_integer_overflow($size)
{
if ($size < 0)
{
    $size += 2.0 * (PHP_INT_MAX + 1);
}

return $size;
}

protected function get_file_size($file_path, $clear_stat_cache = false)
{
if ($clear_stat_cache)
{  
    clearstatcache(true, $file_path);
}

return $this->fix_integer_overflow($_FILES['files']['size'][0]);
}
а тот что первый нет.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
почитав мануал, можно увидеть, что filesize возвращает false в случае ошибки, и нужно читать логи. Возможно тупо у скрипта нет права на чтение файла, или ты неверно указываешь путь, и пытаешься прочитать левый, несуществующий файл.

Твой скрипт отладить можешь только ты.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Arramis, я не хочу критиковать твой код, но у меня только один вопрос, какой сакральный смысл в функции fix_integer_overflow? Зачем она вообще нужна?

Я всегда считал, что задача - сравнить $_FILES['files']['size'] с каким-то максимумом для твоего приложения, дальше либо загрузить файл, если он подходит по остальным параметрам, либо послать сообщение об ошибке.

И, как заметил @флоппик выше, смотри в сторону того, по какой причине filesize может не получить доступ к файлу.
 

Arramis

Новичок
почитав мануал, можно увидеть, что filesize возвращает false в случае ошибки, и нужно читать логи. Возможно тупо у скрипта нет права на чтение файла, или ты неверно указываешь путь, и пытаешься прочитать левый, несуществующий файл.

Твой скрипт отладить можешь только ты.
отлаживал, поверь, пути верные везде, и файл существуетю. Заметил что на одну из директорий где будут загружаемые файлы стоят права 755. На остальных 775.
Но не в этом проблема ибо без получения размера, файлы писались в эту директорию.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Arramis, лично я считаю, что любой код, который используется, неважно твой он или нет - принципиален.

И какой файл ты передаешь параметром в функцию get_file_size?
 

Активист

Активист
Команда форума
Активист, перечитай вопрос и ответь на него еще раз
Потому что на 32 битных ОС размер файла выше 2ГБ будет представлен в виде отрицательного числа. На 64 битных ОС такого не будет. Это некоторый фикс, что бы файлы до 4ГБ размером отображались корректно.

Код:
root@linux-debian-1:/mnt/sdb1/backups/nat.local# ls -lash WEEKLY-Web-2014-09-14.tar.gz
59G -rw------- 1 root root 59G Сен 14 14:21 WEEKLY-Web-2014-09-14.tar.gz

root@linux-debian-1:/mnt/sdb1/backups/nat.local# php -r 'print filesize("WEEKLY-Web-2014-09-14.tar.gz");';
-1605377753

root@linux-debian-1:/mnt/sdb1/backups/nat.local# php -r 'print filesize("WEEKLY-Web-2014-09-14.tar.gz") + 2.0 * (PHP_INT_MAX + 1);';
2689589543

root@linux-debian-1:/mnt/sdb1/backups/nat.local# php -r 'print sprintf("%u", filesize("WEEKLY-Web-2014-09-14.tar.gz"));';
2689589543
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Активист, ты правда думаешь, что он будет грузить файлы более 2 гигов?
 
  • Like
Реакции: WMix
Сверху