|
|
|
| Помогите пожалуйста понять где ошибка
Нужно сделать на сайте чтобы можно было скачать файл не зная где он лежит
Пишу вот такой код
<?
//Тут идут всякие функции
//все только в буфере, никакого вывода
ob_end_clean();
$files="file.zip";
$filename = "download/$files";
$filesize = filesize($filename);
header('Content-Disposition: attachment; filename="'.$files.'";');
header('Content-type: application/zip');
header('Content-Length: '.$filesize);
fpassthru(fopen($filename, 'rb'));
exit;
//пробовал и так
ob_end_clean();
$files="file.zip";
$filename = "download/$files";
$filesize = filesize($filename);
header('Content-Disposition: attachment; filename="'.$files.'";');
header('Content-type: application/zip');
header('Content-Length: '.$filesize);
$fp = fopen($filename, 'rb');
$content = fread($fp, $filesize);
fclose($fp);
print $content;
exit;
//и даже вот так
$filename = file_get_contents("download/$files");
header('Content-Disposition: inline; filename="'.$files.'";');
header("Content-type: application/zip");
header("Content-Length: ".strlen($filename));
echo $filename;
?>
|
все равно у некоторых скачивается нормально, у некоторых получается битый архив, хотя файлы тоже есть, просто не могут их извлечь
в чем может быть ошибка | |
|
|
|
|
|
|
|
для: Visavi
(22.03.2008 в 21:10)
| | > $content = fread($fp, $filesize);
> $filename = file_get_contents("download/$files");
Какая мерзость. filesize нужно получать через filesize(), а выводить readfile'ом. Единственное, что первый код выглядит получше остальных.
> ob_end_clean
Это очистка буфера вывода. Что вообще это тут делает? | |
|
|
|
|
|
|
|
для: Atheist
(22.03.2008 в 21:55)
| | У меня до этого кода идут некоторые данные в буфер я его очищаю чтобы данные не смешивались, у меня работаю все 3 кода без проблем, однако у некоторых имеются проблемы, архивы получаются битыми
> Какая мерзость. filesize нужно получать через filesize(), а выводить readfile'ом
можно подробнее о чем вы
в 1 варианте какие недостатки | |
|
|
|
|
|
|
|
для: Visavi
(22.03.2008 в 23:36)
| | > можно подробнее о чем вы
Функциями file_get_contents() и, естественно, fread'ом, где вторым агрументом передан размер всего файла, ты забиваешь всю информацию в оперативную память. Файл может весить несколько мегабайт и тут начнутся проблемы: превышение лимита выделяемой для PHP-скрипта памяти (обычно 8Mb). Лучше перекладывать больше работы на процессор.
> архивы получаются битыми
Лучше добавь такие строки в начало скрипта:
<?php
error_reporting( E_ALL );
ini_set('display_errors', 0);
ini_set('html_tags', 0);
ini_set('error_log', 'error_log.txt');
?>
|
Создай файл error_log.txt и поставь ему права, позволяющие изменять файл из-под PHP (Apache, даже точнее, если PHP как модуль). По ошибкам можно будет определить где баг. | |
|
|
|