PHP filesize() для файлов> 2 ГБ
Я боролся над тем, как получить допустимый размер файла, который >= 2 ГБ в PHP.
Пример
Здесь я проверяю размер файла размером 3,827,394,560 байт с помощью функции filesize ():
echo "The file is " . filesize('C:MyFile.rar') . " bytes.";
Результат
Вот что он возвращает:
Размер файла -467572736 байт.
Фон
PHP использует целые числа со знаком, что означает, что максимальное число, которое он может представлять, составляет 2,147,483,647 (+/- 2 ГБ).
Вот где она ограничена.
5 ответов:
Http://us.php.net/manual/en/function.filesize.php#102135 дает полное и правильное средство для нахождения размера файла больше 2 ГБ в PHP, не полагаясь на специфичные для ОС интерфейсы.
Суть его заключается в том, что вы сначала используетеfilesize, чтобы получить "низкие" биты, а затем открываете+ищете файл, чтобы определить, сколько кратных 2 ГБ он содержит ("высокие" биты).
Решение, которое я пробовал и, по-видимому, работает, заключается в использовании свойства "Size" объекта 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 байт
Я использовал другой подход, экономя драгоценные серверные ресурсы , взгляните на мой репозиторий GitHubgithub.com/eladkarako/download.eladkarako.com.
Это простой , и полный , download-dashboard, который преодолевает (*редкие) случаи
filesizeошибки с использованием клиентского head-request , Конечно, он не будет встроен в HTML-источник страницы, но будет отрисован (*исправлен) некоторое время спустя, поэтому он является больше подходит для хм..., скажем, расслабленные сценарии..Чтобы сделать это решение доступным, необходимо добавить Apache
.htaccess(или заголовок в PHP), позволяющий использовать значениеContent-Lengthна стороне клиента.По существу, вы можете уменьшить
.htaccessдо простого разрешенияContent-Lengthудаления других правил CORS.. сделать сайт более безопасным.jQuery не использовался, и все это было написано в моем текстовом редакторе Samsung и загружено по FTP с моего смартфона, в 1,5 часа езды на поезде в моем МИЛУИМЕ.. и все же, все еще безупречно ;)
У меня есть одно "халтурное" решение, которое хорошо работает.
Посмотрите пожалуйста эту функцию как я это делаю и вам нужно также включить этот класс, чтобы функция могла хорошо работать или изменяться по вашей потребности.
Пример:
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);Эта функция не является идеальным решением, но вот как работает:
- сначала проверьте, включен ли
shell_execв PHP. Если он включен,он будет проверять с помощью команды shell real filesize.- Если оболочка терпит неудачу и ОС 64bit вернет нормальный
filesize()информация- , Если это 32-битный пойдет на "лязг" способ и рассчитать размер значение buytes.
Заметьте!
Alfter reading сохраняет результаты в строковом формате, чтобы легко вычислять, потому что PHP может вычислять строки, но если вы перенесете результаты более 2 ГБ в целое число, у вас будет та же проблема, что и раньше.
Внимание!
Чанкинг очень медленный, и если вы хотите зациклить это, у вас будет утечка памяти или сценарий может занять несколько минут, чтобы закончите читать все файлы. Если вы используете эту функцию на сервере, где вы включили
shell_exec, у вас будет супер быстрое чтение.P.S.
Если у вас есть какая-то идея для изменений здесь и improvemants не стесняйтесь совершать.
Я использую этот фрагмент кода, написанный мной несколько месяцев назад. Мой код использует exec / com/stat. Я знаю его пределы, но это хорошая отправная точка.
<?php ###################################################################### # Human size for files smaller or bigger than 2 GB on 32 bit Systems # # size.php - 1.2 - 16.04.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 = filesize($file); } if ($size < 1024) { return $size . ' Byte'; } elseif ($size < 1048576) { return round($size / 1024, 2) . ' KB'; } elseif ($size < 1073741824) { return round($size / 1048576, 2) . ' MB'; } elseif ($size < 1099511627776) { return round($size / 1073741824, 2) . ' GB'; } elseif ($size < 1125899906842624) { return round($size / 1099511627776, 2) . ' TB'; } elseif ($size < 1152921504606846976) { return round($size / 1125899906842624, 2) . ' PB'; } elseif ($size < 1180591620717411303424) { return round($size / 1152921504606846976, 2) . ' EB'; } elseif ($size < 1208925819614629174706176) { return round($size / 1180591620717411303424, 2) . ' ZB'; } else { return round($size / 1208925819614629174706176, 2) . ' YB'; } } ?> <?php include("php/size.php"); ?> <?php showsize("files/VeryBigFile.tar"); ?>Надеюсь, это поможет.
Comments