выдача файла на закачку юзеру

Тема в разделе "PHP", создана пользователем sympler, 30 дек 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. sympler

    sympler Постоялец

    Регистр.:
    24 окт 2008
    Сообщения:
    131
    Симпатии:
    6
    как выдавать файл на закачку юзеру?

    я делаю редирект таким образом

    <p class='more_details'>Если закачка не началась в течение 10 секунд, обратитесь в техподдержку, мы вышлем вам работу по email.</p>
    <meta HTTP-EQUIV="REFRESH" CONTENT="9;URL=<?=$link;?>">


    но тогда в опере при закачке архива rar получаются кракозябры ((

    как будет удобнее для юзеров? было бы неплохо узнать как это делают на депозитфайлс :)
     
  2. farm

    farm

    Регистр.:
    8 июн 2006
    Сообщения:
    537
    Симпатии:
    106
    Если не ошибаюсь - скрипт должен HTTP header отдавать правильный. Погуглите по этому ключу, все поймете.
     
    sympler нравится это.
  3. sympler

    sympler Постоялец

    Регистр.:
    24 окт 2008
    Сообщения:
    131
    Симпатии:
    6
    до этого я конечно гуглил и пытался вот так еще, но чтото никакой реактции:

    header('Content-type: application/x-download');
    header('Content-Length: ' . filesize("$link"));
    header('Content-Disposition: attachment; filename="downloaded.rar"');
    readfile("$link");

    это можно вставлять в любом месте кода или только в начале файла?

    было бы неплохо если бы при появлении окна на закачку ставилось бы нужное название файла (в основном названия надо на русском сохранять, а на сервере хранится случайное имя файла )
     
  4. Yozik

    Yozik

    Регистр.:
    5 дек 2007
    Сообщения:
    239
    Симпатии:
    65
    header('CONTENT-TYPE: text/html; charset=Ваша кодировка');
     
  5. admLoki

    admLoki генератор случайного PHP

    Регистр.:
    14 сен 2006
    Сообщения:
    481
    Симпатии:
    93
    Бред. Тогда клиенту уйдут ASCII-данные вместо бинарных.

    Добавлено через 3 минуты
    Для RAR файлов отдавайте тип application/x-rar-compressed.
     
  6. SimpleWarrior

    SimpleWarrior Писатель

    Регистр.:
    25 дек 2009
    Сообщения:
    9
    Симпатии:
    1
    Это нужно вставлять до отправки какого-либо контента, в ином случае получишь ошибку.
     
  7. askarbin

    askarbin

    Регистр.:
    31 мар 2009
    Сообщения:
    293
    Симпатии:
    36
    На всеми известном ifolder'e такая проблема была и до сих пор существует, приходится кликать по линку и нажимать сохранить по ссылке как..
    Download Master такую ссылку не перехватывает, задолбался уже клацать. Может как-то можно эту проблему на стороне клиента решить?
    Не сочтите офтопом, но уже достала эта штука, а тут как раз обсуждается такая тема
     
  8. sympler

    sympler Постоялец

    Регистр.:
    24 окт 2008
    Сообщения:
    131
    Симпатии:
    6
    согласен что на многих серьзных сайтах существует данная проблема
    причем это крайне неудобно пользователям

    вот и нашел выход сам ))

    вот он:

    <?php

    header('Content-type: application/*');

    header('Content-Length: ' . filesize("полный путь к файлу"));

    header('Content-Disposition: attachment; filename="любое название файла, но лучше со своим расширением"');

    readfile('полный путь к файлу');

    ?>
     
    solarscape нравится это.
  9. saxel

    saxel Постоялец

    Регистр.:
    4 дек 2007
    Сообщения:
    118
    Симпатии:
    23
    PHP:
    class download {
        
        var 
    $properties = array ('old_name' => ""'new_name' => ""'type' => ""'size' => ""'resume' => ""'max_speed' => "" );
        
        var 
    $range 0;
        
        function 
    download($path$name ""$resume 0$max_speed 0) {
            
            
    $name = ($name == "") ? substrstrrchr"/" $path"/" ), ) : $name;
            
    $name explode"/"$name );
            
    $name end$name );
            
            
    $file_size = @filesize$path );
            
            
    $this->properties = array ('old_name' => $path'new_name' => $name'type' => "application/force-download"'size' => $file_size'resume' => $resume'max_speed' => $max_speed );
            
            if( 
    $this->properties['resume'] ) {
                
                if( isset( 
    $_SERVER['HTTP_RANGE'] ) ) {
                    
                    
    $this->range $_SERVER['HTTP_RANGE'];
                    
    $this->range str_replace"bytes="""$this->range );
                    
    $this->range str_replace"-"""$this->range );
                
                } else {
                    
                    
    $this->range 0;
                
                }
                
                if( 
    $this->range $this->properties['size'] ) $this->range 0;
            
            } else {
                
                
    $this->range 0;
            
            }
        
        }
        
        function 
    download_file() {
            
            if( 
    $this->range ) {
                
    header$_SERVER['SERVER_PROTOCOL'] . " 206 Partial Content" );
            } else {
                
    header$_SERVER['SERVER_PROTOCOL'] . " 200 OK" );
            }
            
            
    header"Pragma: public" );
            
    header"Expires: 0" );
            
    header"Cache-Control:" );
            
    header"Cache-Control: public" );
            
    header"Content-Description: File Transfer" );
            
    header"Content-Type: " $this->properties["type"] );
            
    header'Content-Disposition: attachment; filename="' $this->properties['new_name'] . '";' );
            
    header"Content-Transfer-Encoding: binary" );
            
            if( 
    $this->properties['resume'] ) header"Accept-Ranges: bytes" );
            
            if( 
    $this->range ) {
                
                
    header"Content-Range: bytes {$this->range}-" . ($this->properties['size'] - 1) . "/" $this->properties['size'] );
                
    header"Content-Length: " . ($this->properties['size'] - $this->range) );
            
            } else {
                
                
    header"Content-Length: " $this->properties['size'] );
            
            }
            
            @
    ini_set'max_execution_time');
            @
    set_time_limit();
            
            
    $this->_download$this->properties['old_name'], $this->range );
        }
        
        function 
    _download($filename$range 0) {
            
            @
    ob_end_clean();
            
            if( (
    $speed $this->properties['max_speed']) > $sleep_time = ($speed) * 1e6;
            else 
    $sleep_time 0;
            
            
    $handle fopen$filename'rb' );
            
    fseek$handle$range );
            
            if( 
    $handle === false ) {
                return 
    false;
            }
            
            while ( ! 
    feof$handle ) ) {
                print( 
    fread$handle1024 ) );
                
    ob_flush();
                
    flush();
                
    usleep$sleep_time );
            }
            
            
    fclose$handle );
            
            return 
    true;
        }

    }



    $file = new download FILE_DIR $row['onserver'], $row['name'], $config['files_force'], $config['files_max_speed'] );


    $file->download_file ();
    из ДЛЕ... если что-то непонятно - пишите в приват, помогу
     
    lowSkill нравится это.
Статус темы:
Закрыта.