У меня есть архив tar на сервере, который должен быть загружен через php. Это код, который я использовал:
$content=file_get_contents($tar); header("Content-Type: application/force-download"); header("Content-Disposition: attachment; filename=$tar"); header("Content-Length: ".strlen($content)); unlink($name); die($content);
Файл загружен, но он сломан, и он не может быть открыт. Я думаю, что что-то не так с заголовками, потому что файл на сервере может быть открыт без проблем. Вы знаете, как я могу решить эту проблему?
UPDATE Я попытался напечатать iframe следующим образом:
<iframe src="<?php echo $tar?>"></iframe>
И загрузка работает, поэтому я уверен, что в заголовках чего-то не хватает.
Я использовал этот код, когда мне приходилось это делать:
function _Download($f_location, $f_name){ header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Length: ' . filesize($f_location)); header('Content-Disposition: attachment; filename=' . basename($f_name)); readfile($f_location); } _Download("../directory/to/tar/raj.tar", "raj.tar"); //or _Download("/var/www/vhost/domain.com/httpdocs/directory/to/tar/raj.tar", "raj.tar");
Попробуй это.
Не используйте 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-файл фактически gzipped, используйте вместо него «application / x-gtar».
Если файл по-прежнему выходит из строя после загрузки, выполните некоторую проверку на стороне клиента:
Попробуйте следующее:
$s_filePath = 'somefile.ext'; header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="'. s_filePath.'"'); header('Content-Transfer-Encoding: binary'); header('Accept-Ranges: bytes'); header('Cache-control: private'); header('Pragma: private'); header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); header("Content-Length: ".filesize($s_filePath)); $r_fh = fopen($s_filePath,'r'); while(feof($r_fh) === false) { $s_part = fread($r_fh,10240); echo $s_part; } fclose($r_fh); exit();
Используйте Content-Type: application / octet-stream или Content-Type: application / x-gtar