PHP filesize () для файлов> 2 ГБ - PullRequest
5 голосов
/ 19 февраля 2012

Я боролся за то, чтобы получить действительный размер файла для файла, который> = 2 ГБ в PHP.

Пример
Здесь я проверяю размер файлафайл размером 3 827 394 560 байт с функцией filesize ():

echo "The file is " . filesize('C:\MyFile.rar') . " bytes.";

Результат
Это то, что он возвращает:

Файл-467572736 байт.

Фон
PHP использует целые числа со знаком, то есть максимальное число, которое он может представлять, составляет 2 147 483 647 (+/- 2 ГБ).
Это где оно ограничено.

Ответы [ 7 ]

4 голосов
/ 19 февраля 2012

http://us.php.net/manual/en/function.filesize.php#102135 предоставляет полное и правильное средство для определения размера файла размером более 2 ГБ в PHP без использования интерфейсов, специфичных для ОС.

Суть этого в том, что вы сначала используете filesize, чтобы получить «младшие» биты, затем открываете + ищите файл, чтобы определить, сколько в нем кратных 2 ГБ («старших» битов).

3 голосов
/ 19 февраля 2012

Решение, которое я пробовал и, по-видимому, работает, заключается в использовании свойства «Размер» COM FileObject. Я не совсем уверен, какой тип он использует.

Это мой код:

function real_filesize($file_path)
{
    $fs = new COM("Scripting.FileSystemObject");
    return $fs->GetFile($file_path)->Size;
}

Это просто называется следующим образом:

$file = 'C:\MyFile.rar';
$size = real_filesize($file);
echo "The size of the file is: $size";

Результат

Размер файла: 3 827 394 560 байт

1 голос
/ 07 июня 2015

Я использовал другой подход, экономия ценных серверных ресурсов , взгляните на мой репозиторий GitHub github.com / eladkarako / download.eladkarako.com .

Это обычный и полный , панель инструментов загрузки, которая преодолевает (*)редко) случаи filesize ошибка с использованием клиентского заголовочного запроса , предоставленная, она не будет встроена в исходный HTML-код страницы, но визуализирована (* исправлена) через некоторое время, поэтому больше подходит для хмм ... скажем, расслабленные сценарии.

Чтобы сделать это решение доступным, Apache .htaccess (или заголовок в PHP) должен бытьдобавлено разрешение использования на стороне клиента значения Content-Length.

По сути, вы можете уменьшить .htaccess, чтобы просто Content-Length удалить другие правила CORS .. сделать сайт более безопасным.

- jQuery не использовался ивсе это было написано в моем текстовом редакторе Samsung и загружено по FTP с моего смартфона, за 1,5 часа езды на поезде в моем MILUIM .. и, тем не менее, все еще безупречно ;)

0 голосов
/ 11 июля 2019

Для тех, кто находится на хосте Linux, самое простое решение, которое я нашел, это использовать:

exec("stat --format=\"%s\" \"$file\"");

Это предполагает, что в имени файла не должно быть кавычек или символов новой строки, и технически возвращает строку вместоЯ полагаю, это число, но он хорошо работает с этим методом, чтобы получить читаемый человеком размер файла .

Самый большой файл, с которым я это проверял, был около 3,6 ГБ.

0 голосов
/ 03 марта 2019

Я знаю, что это старая версия, но я использую PHP x64 5.5.38 (пока) и не хочу обновляться до последней версии 7.x.

Я прочитал всеэти посты о поиске файлов размером более 2 ГБ, но все решения очень медленные для большого количества файлов.

Итак, вчера я создал расширение C / C ++ PHP "php_filesize.dll", то естьиспользуя возможности C / C ++ для поиска размеров файлов несколькими методами, которые я нашел, он также совместим с UTF-8 и очень быстр.

Вы можете попробовать: http://www.jobnik.org/files/PHP/php_filesize.zip

Использование:

методы:

0 - использование GetFileAttributesEx

1 - использование CreateFile

2 - использование FindFirstFile

-1 - использованиеstat64 (по умолчанию и необязательно)

$ fsize = php_filesize ("filepath", $ method_optional);

  • Возвращает размер файла в строковом типе до 9 PetaByte

Кредиты:

Методы FileSize: Проверка размера файла без открытия файла в c ++?

Поддержка UTF-8: https://github.com/kenjiuno/php-wfio

0 голосов
/ 21 января 2018

У меня есть одно «хакерское» решение, которое работает хорошо.

Посмотрите пожалуйста ЭТА функция как я это делаю, и вам также нужно включить этот класс , чтобы функция моглаработает хорошо или изменить по вашей необходимости.

пример:

include_once 'class.os.php';
include_once 'function.filesize.32bit.php';

// Must be real path to file
$file = "/home/username/some-folder/yourfile.zip";
echo get_filesize($file);

Эта функция не является идеальным решением, но вот как она работает:

  1. Сначала проверьте, включен ли shell_exec в PHP.Если он включен, он проверяет с помощью команды оболочки реальный размер файла.
  2. Если произойдет сбой оболочки и ОС станет 64-битной, вернет нормальную filesize() информацию
  3. Если 32-битная, перейдет в метод "разбивки" ирассчитывать размер файла при чтении байтов.

ПРИМЕЧАНИЕ!

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

ПРЕДУПРЕЖДЕНИЕ!

Чанкинг очень медленный, и если вы захотите зациклить его, у вас будет утечка памяти или сценарийможет занять несколько минут, чтобы закончить чтение всех файлов.Если вы используете эту функцию на сервере, где вы включили shell_exec, у вас будет супер быстрое чтение.

PS

Если у вас есть какая-то идея об изменениях здесь и улучшатели не стесняются коммитить.

0 голосов
/ 10 июня 2015

Чтобы получить правильный размер файла, я часто использую этот фрагмент кода, написанный мной несколько месяцев назад. Мой код использует: exec / com / stat, где доступно. Я знаю его границы, но это хорошая отправная точка. Лучшая идея - использовать filesize() на 64-битной архитектуре.

<?php
  ######################################################################
  # Human size for files smaller or bigger than 2 GB on 32 bit Systems #
  # size.php - 1.3 - 21.09.2015 - Alessandro Marinuzzi - www.alecos.it #
  ######################################################################
  function showsize($file) {
    if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') {
      if (class_exists("COM")) {
        $fsobj = new COM('Scripting.FileSystemObject');
        $f = $fsobj->GetFile(realpath($file));
        $size = $f->Size;
      } else {
        $size = trim(@exec("for %F in (\"" . $file . "\") do @echo %~zF"));
      }
    } elseif (PHP_OS == 'Darwin') {
      $size = trim(@exec("stat -f %z " . $file));
    } else {
      $size = trim(@exec("stat -c %s " . $file));
    }
    if ((!is_numeric($size)) || ($size < 0)) {
      $size = filesize($file);
    }
    if ($size < 1024) {
      echo $size . ' Byte';
    } elseif ($size < 1048576) {
      echo number_format(round($size / 1024, 2), 2) . ' KB';
    } elseif ($size < 1073741824) {
      echo number_format(round($size / 1048576, 2), 2) . ' MB';
    } elseif ($size < 1099511627776) {
      echo number_format(round($size / 1073741824, 2), 2) . ' GB';
    } elseif ($size < 1125899906842624) {
      echo number_format(round($size / 1099511627776, 2), 2) . ' TB';
    } elseif ($size < 1152921504606846976) {
      echo number_format(round($size / 1125899906842624, 2), 2) . ' PB';
    } elseif ($size < 1180591620717411303424) {
      echo number_format(round($size / 1152921504606846976, 2), 2) . ' EB';
    } elseif ($size < 1208925819614629174706176) {
      echo number_format(round($size / 1180591620717411303424, 2), 2) . ' ZB';
    } else {
      echo number_format(round($size / 1208925819614629174706176, 2), 2) . ' YB';
    }
  }
?>

<?php include("php/size.php"); ?>

<?php showsize("files/VeryBigFile.tar"); ?>

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...