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

  • Автор темы Автор темы 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(filesize($file_path)); // возвращается false (
}
беда в том, что file_size возвращает false.
Пробывал fopen(), file(), и file_get_contents() ом открывать файл и руками посчитать длину символов, но все они возвращают false.

Какие могу быть причины такого поведения ?
сервер на debian, php 5.3.3
 
Arramis, у тебя в $_FILES есть переменная, которая отвечает за размер, разве нет?
 
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]);
}
а тот что первый нет.
 
почитав мануал, можно увидеть, что filesize возвращает false в случае ошибки, и нужно читать логи. Возможно тупо у скрипта нет права на чтение файла, или ты неверно указываешь путь, и пытаешься прочитать левый, несуществующий файл.

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

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

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

Твой скрипт отладить можешь только ты.
отлаживал, поверь, пути верные везде, и файл существуетю. Заметил что на одну из директорий где будут загружаемые файлы стоят права 755. На остальных 775.
Но не в этом проблема ибо без получения размера, файлы писались в эту директорию.
 
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
 
Активист, ты правда думаешь, что он будет грузить файлы более 2 гигов?
 
  • Like
Реакции: WMix
Сверху