#1 03.11.06 17:29
[php] выдача файла через ссылку
Код: php:
<?php if(isset($_REQUEST["pass"]))$pass=$_REQUEST["pass"];else $pass=""; $pref['media_films_path']="C:/temp"; $file="2gisNsk98a.zip"; $filename_saveUser=$file; $seek=0; if($pass=="1234") { //Меняем лимит работы скрипта до 20 минут @set_time_limit(20 * 60); @ini_set("max_execution_time", 20 * 60); //устанавливаем размер буфера для скачивания файла $bufsize = 1024; $filename = $pref['media_films_path'].'/'.$file; //подготавливаем полный путь до файла (с именем файла) $flag=0; //если файл существует и его можно прочитать и пользователь соединен if(is_file($filename)&&is_readable($filename)&& connection_status() == 0){ //если браузер пользователя MS Internet Explorer if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) { //, то редактирем имя файла (для пользователя) следующим образом: // заменяем точку на символ %2e $filename_saveUser = preg_replace('/\./', '%2e', $filename_saveUser, substr_count($filename_saveUser, '.') - 1); } //если пользователь докачивает (послан заголовок) if (isset($_SERVER['HTTP_RANGE'])) { $seek = intval(substr($_SERVER['HTTP_RANGE'] , strlen('bytes='))); //читаем с какого байта нужно докачивать } //при отсоединении пользователя - прерывать работу скрипта ignore_user_abort(true); $data_len = filesize($filename); //получаем размер файла if ($seek >= $data_len) { $seek = 0; } //если файл уже полностью закачан, то новая закачка //открываем файл для чтения $res = fopen($filename, 'rb'); //если режим докачки if ($seek>0) { fseek($res , $seek); //, то переходим в файле к месту откуда начнем докачку } $data_len -= $seek; //вычисляем длину данных //посылаем заголовки header("Expires: 0"); header("Cache-Control: max-age=30" ); header("Content-Type: application/force-download"); header("Content-Disposition: attachment; filename=\"{$filename_saveUser}\""); header("Content-Length: {$data_len}"); header("Pragma: public"); if ($seek>0) //если режим докачки, то посылаем дополнительные заголовки { header("Accept-Ranges: bytes"); header("HTTP/1.0 206 Partial Content"); header("status: 206 Partial Content"); header("Content-Range: bytes {$seek}-".($data_len - 1)."/{$data_len}"); } // addamount($file,$data_len,$coin); //, то сохраняем лог в БД о обращении к файлу //пока соединение не сброшено и весь файл не прочитан while (!feof($res)) { echo fread($res , $bufsize); //выводим порцию файла $data_len -= $bufsize; //обновляем сведения о том сколько о осталось до конца файла } //закрываем соединение с файлом fclose($res); } else echo "нет файла "; } else echo "Ошибочка вышла"; ?>
так во фишка в том , что если файл получать через FlashGet то все нормально, а если через любой браузер, то полученный файл отличается, причем чем больше файл тем болше теряется, причем известно что теряется из конца( на 20 Мб теряется около 16кб)
Исправлено Stell Hawk (03.11.06 17:29)
Offline
#3 04.11.06 11:43
Re: [php] выдача файла через ссылку
да нет буковок не много, надо учесть докачку, а если и сделать поменьше буковок
Код: php:
$pref['media_films_path']="C:/temp"; $file="2gisNsk98a.zip"; $filename_saveUser=$file; $bufsize = 1024; $filename = $pref['media_films_path'].'/'.$file; $data_len = filesize($filename); header("Expires: 0"); header("Cache-Control: max-age=30" ); header("Content-Type: application/force-download"); header("Content-Disposition: attachment; filename=\"{$filename_saveUser}\""); header("Content-Length: {$data_len}"); header("Pragma: public"); while (!feof($res)) { echo fread($res , $bufsize); //выводим порцию файла } fclose($res);
так мы отрубили возмодность докачки, многоканльность,
все равно, не качает до конца, файла, може ту кого есть че написанное, а то мовсем не догоню , в чем рамс.
Offline
#5 04.11.06 12:09
Re: [php] выдача файла через ссылку
странно..не ушлоЖ-)
Исправлено Stell Hawk (04.11.06 12:13)
Offline
#6 04.11.06 12:13
Re: [php] выдача файла через ссылку
Karminsky, я уже препробывал стока методов там, пришел вот к чему, когда качаешь через внутреннюю качалку Opera не докачивает немного, и выставляет что недокаченно, т.к. соединенние прерванно, если тыкнуть запуск, то он докачивает(только если первый вариант, потому как второй не потдерживает докачку), полность, отсюда вывод видимо соединение считается оборванным, еще до того как произошел весь вывод,( а флешгет сам занимается докачкой, потому косяка нет), я пытался ставить щадерки, и.т.п, ничего не помоагет....черт знает что, получается
Offline

