Можете ли вы доверять размер файла, заданный массивом $_FILES в PHP?

Извините, если это тривиально или очевидно, но я не смог найти ответ, выполнив его.

Откуда взялось значение size в массиве $_FILES['name']? Не могли бы вы доверять его значению ($_FILES['name']['size']) или все еще проверить его с помощью функции filesize()?

Другими словами, необходимо ли проверять фактический размер файла функцией filesize, чтобы заметить, правильно ли он загружен?

Ответы

Ответ 1

Если файл загружен правильно и все в порядке, вы можете использовать информацию, предоставленную PHP superglobal $_FILES. Использование filesize() добавляет небольшие накладные расходы, поскольку ОС необходимо проверить файл для размера. Это зависит от вас, но, проверяя источник PHP на то, как он это делает, это ясно указывает, что он правильно вычисляет размер файла в многопрофильном запросе HTTP. В принципе, вы будете делать ту же работу снова, если бы вы были в filesize() файле.

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

Ответ 2

PHP, похоже, пересчитывает размер файла после его загрузки. Хотя клиент отправляет заголовок, указывающий content-length файла, на основе тестов (с помощью PHP 5.5) этот заголовок просто игнорируется, а вместо этого измеряется длина. Лично я всегда использовал filesize(), чтобы получить размер файла, так как вы можете быть более уверенным в том, какое измерение используется, но в конечном итоге оно зависит от вас. В любом случае $_FILES['file_name']['size'] представляется безопасным значением для использования.

Ответ 3

Вы должны проверить, соответствует ли сообщение $_FILES['file_name']['size'], указанному клиентом, значением, заданным filesize(). Разница может указывать на ошибку при передаче загруженного файла.