У меня есть php-скрипт (на самом деле https://drupal.org/project/file_force), который заставляет пользователей которые нажимают на ссылку, чтобы загрузить эту ссылку, добавив правильные заголовки к ответу.
Эта ссылка работает нормально в 90% случаев. Иногда передается неправильная длина содержимого, поэтому пользователи получают явно усеченные файлы. Ошибка постоянно возникает в определенных файлах, но если эти файлы повторно загружаются, ошибка может не появиться в новом экземпляре, что заставляет меня думать, что это не проблема с файлами, а где-то в кеше. Поэтому я каждый раз запускал clearstatcache() безрезультатно. Что странно, так это то, что php передает правильный размер файла или говорит, что это когда я передаю строку, которую он вставляет в файл журнала.
Вот соответствующий код:
clearstatcache();
return array(
'Content-Type: ' . $mimeinfo,
'Content-Disposition: ' . $disposition . '; filename="' . basename($filepath) . '";',
// Content-Length is also a good header to send, as it allows the browser to
// display a progress bar correctly.
// There's a trick for determining the file size for files over 2 GB. Nobody
// should be using this module with files that large, but… the sprintf()
// trickery makes sure the value is correct for files larger than 2GB. See
// note at http://php.net/filesize
'Content-Length: ' . sprintf('%u', filesize($filepath)),
);
Пример вывода sprintf('%u', png($filepath)) для файла, который не работает, - это 2682059
, который каким-то образом преобразуется в 1740048
, когда браузер его видит.
Я пытался удалить функцию sprintf безрезультатно. Я также пытался вообще не включать объявление Content-Length, но кто-то все равно привязывается к неверному значению. Это последнее доказательство, возможно, предполагает, что какой-то другой код переопределяет заголовки контента, которые я устанавливаю здесь, но, похоже, он оставляет в покое любые другие заголовки, которые я изменяю в приведенном выше коде, чтобы проверить эту теорию.
Есть мысли, где искать?
filesize($filepath)
. - person Nicholas Evans   schedule 30.10.2013