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 ГБ).

Вот где она ограничена.

660   5  

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);

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

  1. сначала проверьте, включен ли shell_exec в PHP. Если он включен,он будет проверять с помощью команды shell real filesize.
  2. Если оболочка терпит неудачу и ОС 64bit вернет нормальный filesize() информация
  3. , Если это 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

    Ничего не найдено.