|
|
|
| Нужен был скрипт, отдающий файлы, с докачкой. Искал, но ничего хорошего не нашел. Пришлось писать самому. Вроде все работает, но кое-что меня смущает.
Вот главная функция:
function download($fname){
ob_end_clean();
$fpath = $fname;
if(!file_exists($fpath)){
error('404 File Not Found',"Sorry, file not found. 4");
return false;
}
$handle = fopen($fpath, "rb");
if(!handle){
error('404 File Not Found',"Sorry, file not found. 5");
return false;
}
if(isset($HTTP_RANGE)){
header("HTTP/1.1 206 Partial Content");
$bytes = $HTTP_RANGE;
$bytes = substr($HTTP_RANGE,6,strlen($HTTP_RANGE)-7);
$rng = 1;
}else{
header("HTTP/1.1 200 Ok");
$bytes=0;
}
$size = filesize($fpath);
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
header("Content-Type: application/force-download");
header("Content-Transfer-Encoding: binary");
header("X-Powered-By: MK");
header("X-Scripts: MKDownloader/1.0");
header("Content-Transfer-Encoding: binary");
$length = $size - $bytes;
if ($rng){
header("Content-Range: bytes $bytes-$size/$size");
header("Content-Length: $length");
}else{
header("Content-Length: $size");
}
header("Content-Disposition: attachment; filename=$fname");
fseek($handle, $bytes);
flush();
fpassthru($handle);
flush();
fclose($handle);
return((connection_status()==0) and !connection_aborted());
}
|
Я отдаю файл с помощью этой функции:
Это правильно?
Или все же следует отдавать с помощью такой конструции? :
while(!feof($file) and (connection_status()==0)) {
print(fread($file, 1024*8));
flush();
}
|
Я забеспокоился из-за того, что пришло 2-3 письма от пользователей - невозможно скачать файл. 2-3 неудачных попытки из нескольких тысяч закачек. | |
|
|
|
|
|
|
|
для: mannnz
(11.11.2005 в 19:33)
| | А зачем идет
print(fread($file, 1024*8));
|
я делал так просто..
fpassthru, не люблю я ее, судя по описанию она читает файл и пихает его в память... я представляю себе 200 потоков на файл в 200мб, уж тогда точно его не кто не сможет скачать...
может быть я где-то не прав....
header("Content-Transfer-Encoding: binary");
|
я бы убрал... у меня была из-за этого проблема со скачкай архивов!!! тем более он повтаряется | |
|
|
|
|
|
|
|
для: mannnz
(11.11.2005 в 19:33)
| | Эти 2-3 пользователя вообще скачать ничего не могут или у них возникает 2-3 сбоя на несколько тысяч? Вообще ничего криминального вроде не видно с первого взгляда... | |
|
|
|
|
|
|
|
для: cheops
(12.11.2005 в 00:09)
| | >Эти 2-3 пользователя вообще скачать ничего не могут или у
>них возникает 2-3 сбоя на несколько тысяч? Вообще ничего
>криминального вроде не видно с первого взгляда...
Вот этого я не знаю. Про эти 2-3 сбоя мне чел сказал, которому я поставил этот скрипт. Говорит, что это первые 2-3 сбоя из неск. тыс. закачек. Пользователи, как я понял, попробовали закачать - не получилось, написали письмо ;) . Вот так. Наверно так и оставлю.
2fabik
>fpassthru, не люблю я ее, судя по описанию она читает файл и пихает его в память... я >представляю себе 200 потоков на файл в 200мб, уж тогда точно его не кто не сможет скачать...
Файлы <10 метров. А где ты описание этой функции нашел? Я искал, но ничего вразумительного не нашел.
А readfile() разве не в память читает? И как докачку сделать, используя readfile() ?
header("Content-Transfer-Encoding: binary");
|
Это да... надо удалить один. Но с архивами проблем нет - все правильно качается. | |
|
|
|
|
|
|
|
для: mannnz
(12.11.2005 в 00:30)
| | А чем качают не уточняют? | |
|
|
|
|
|
|
|
для: cheops
(12.11.2005 в 00:35)
| | Из браузера. IE 5-6 | |
|
|
|