Не используйте file_get_contents()
, а затем echo
или print
для вывода файла. Это загружает все содержимое файла в память. Большой файл может / превысит memory_limit
вашего скрипта и уничтожит скрипт.
Для выгрузки содержимого файла на клиент лучше всего использовать readfile()
- он будет правильно отбрасывать куски файлов и выплевывать их на клиенте, не превышая доступную память. Просто не забудьте отключить буферизацию вывода перед тем, как сделать это, иначе вы просто делаете file_get_contents()
снова
Итак, в итоге вы получите:
$tar = 'somefile.tar';
$tar_path = '/the/full/path/to/where/the/file/is' . $tar;
$size = filesize($tar_path);
header("Content-Type: application/x-tar");
header("Content-Disposition: attachment; filename='".$tar."'");
header("Content-Length: $size");
header("Content-Transfer-Encoding: binary");
readfile($tar_path);
Если ваш tar-файл действительно gzip-файл, используйте взамен «application / x-gtar».
Если файл все еще выходит поврежденным после загрузки, сделайте некоторую проверку на стороне клиента:
- Загруженный файл равен 0 байтам, но процесс загрузки, похоже, занял намного больше времени, чем 0 байтов для передачи, тогда это что-то на стороне клиента, препятствующее загрузке. Вирусный сканер? Trojan?
- Загруженный файл присутствует частично, но меньше оригинала? Что-то убило передачу преждевременно. Перегрузить брандмауэр? У менеджера загрузок плохой день? Буферизация вывода активна на сервере и последний буферный буфер не очищен должным образом?
- Имеет ли загруженный файл такой же размер, как и у оригинала? Сделайте контрольную сумму md5 / sha1 / crc на обеих копиях. Если они одинаковы, значит что-то не так с приложением, открывающим файл, а не с самим файлом
- Загруженный файл больше оригинала? Откройте файл в блокноте (или что-то лучше, например notepad ++, который не требует много лет, чтобы открывать большие файлы) и посмотрите, были ли какие-либо предупреждения PHP или невидимые пробелы, которые вы не видите в своем скрипте, были вставлены в загрузку в начале или конец файла.