Быстрый лёгкий надёжный форумный движок
Вы не вошли.
Страницы 1
Тема закрыта
UPDATED @ 11.o6.2oo8
исправлены ошибки, небольшие доработки
В связи с тем, что при хреновом инете (гпрс) не мог скачать необходимый файл со своего форума, решил доделать загрузку в Attachment Mod'е. Чуток погуглив и почитав что написал сам автор мода по сабжу, родил следующее:
файл: /attachment.php
... skipped ...
else {
// put the file out for download
// open a pointer to the file
$attach_full_path = $pun_config['attach_basefolder'].$attach_location;
$fp = @fopen( $attach_full_path, "rb" );
if ( !$fp )
message($lang_common['Bad request']);
else {
// получаем инфо о файле
$attach_stat = fstat($fp);
if ( isset($_SERVER['HTTP_RANGE']) ) {
/* кто-то пытается продолжить прерванную загрузку */
// использована информация из следующих источников:
// [*] исходники PHCDownload (The best File Management CMS) - http://www.phpcredo.com
// [*] RFC 2616 "Hypertext Transfer Protocol -- HTTP/1.1" - http://www.faqs.org/rfcs/rfc2616
// [*] Google - http://google.com.ua
// [*] "Записки PHP-кодера - Загрузка файла по HTTP" - http://scorpion.amateria.ru/2007/10/02/zagruzka-fajla-po-http.html
// смотрим с какого байта нам нужно отдать файл
list( , $server_range ) = explode( "=", $_SERVER['HTTP_RANGE'] );
list( $server_range ) = explode( "-", $server_range );
@fseek( $fp, $server_range );
// send headers
header( $_SERVER['SERVER_PROTOCOL'] . " 206 Partial Content" );
header( "Accept-Ranges: bytes" );
header( "Content-Range: bytes " . $server_range . "-" . ( $attach_size - 1 ) . "/" . $attach_size . "" );
header( "Content-Length: " . ($attach_size - $server_range) . "" );
}
else {
/* новая загрузка */
// update number of downloads
$result = $db->query('UPDATE '.$db->prefix.'attach_2_files SET downloads=downloads+1 WHERE id=\''.$attach_item.'\'') or error();
// send headers
header( $_SERVER['SERVER_PROTOCOL'] . " 200 OK" );
header( "Content-Length: " . $attach_size . "" );
}
header( "Last-Modified: " . date( "D, d M Y H:i:s \G\M\T" , $attach_stat['mtime'] ) );
header( "Cache-control: public" );
header( "Pragma: public" );
header( "Expires: 0" );
if ( strlen( $attach_mime ) != 0 )
header( "Content-Type: " . $attach_mime . "" );
else
header( "Content-Type: application/octet-stream" );
header( "Content-Disposition: attachment; filename=\"" . $attach_filename . "\"" );
// размер кусков, которыми отдаем файл (bytes)
$chunk_size = 1024*10;
// and finally send the file
while ( !feof( $fp ) ) {
echo fread( $fp, $chunk_size );
@flush();
@ob_flush();
}
fclose($fp);
}
}
кто хочет - пользуйтесь, кто может - покажите где/что можно сделать лучше
Редактировался lokee (2008-06-11 03:39:49)
Страницы 1
Тема закрыта