Русское сообщество fluxbb

Быстрый лёгкий надёжный форумный движок

Вы не вошли.

Объявление

Вы можете внести свой вклад в содержание сайта. Жертвователи попадут в почетную группу "Спонсоры". Поддержать сайт.

#1 2008-06-07 19:28:45

lokee
Гость

догрузка файлов в Attachment Mod 2.0.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);
    
    }
}

кто хочет - пользуйтесь, кто может - покажите где/что можно сделать лучше wink

Редактировался lokee (2008-06-11 03:39:49)

Подвал доски

Под управлением FluxBB. Хостинг Hostens