Avatar billede rathkjen Nybegynder
31. marts 2008 - 14:42 Der er 12 kommentarer og
1 løsning

Hastighedsbegrænsning ved download

Jeg søger et script der giver mulighed for at hastighedsbegrænse download. Så folk fx kun kan downloade med 25 kb/s fra min side.

Er der en der ligger ind med sådan et script? :)
Avatar billede gurly Praktikant
31. marts 2008 - 15:00 #1
det er vel noget du indstiller i serverens opsætning
Avatar billede rathkjen Nybegynder
31. marts 2008 - 15:23 #2
Muligvis, har bare set mange sider hvor man kan købe sig til en hurtigere downloadhastighed og hvis det skal gå gennem serverens opsætning bliver det vel en rimelig tung kode. uden dog at vide det..
Avatar billede coderdk Praktikant
31. marts 2008 - 19:45 #3
Jeg har en klasse her, ikke 100% testet (så vidt jeg husker), men den kan resume (altså understøtter også downloadmanagers - i.e. flere connections), og speed limit:

<?php

    set_time_limit(0); // Let script run indefinitely
    ignore_user_abort(TRUE); // Force script to continue if user aborts
    ini_set("zlib.output_compression", "off"); // Turn off output compression
    ob_end_flush(); // Turn off output buffering
    header( "Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0" );
    header( "Pragma: no-cache" );
    header( "Expires: 0" );

    class Download
    {
        /* (c) L. Petersen, lars at ordo dot dk - www.ioflux.net */
        var $_limit = 0;
        var $_file = NULL;
        var $_size = 0;
        var $_fp = NULL;
        var $_blocksize = 256000;
        var $_root = '';

        // Set base path for downloading, optional
        function SetRoot($root)
        {
            $this->_root = realpath( $root );
            if ( $this->_root !== FALSE )
            {
                $this->_root .= DIRECTORY_SEPARATOR;               
            }
            else
            {
                die( "Error: Root $root does not exist" );
            }
        }

        function SetFile( $file )
        {
            // Set the file and get the size of it
            if ( $this->_root != '' && FALSE !== ( $file = realpath( $this->_root . $file ) ) )
            {
                if ( substr( $file, 0, strlen( $this->_root ) ) != $this->_root )
                {
                    die( "Permission denied." );
                }
            }
            if ( is_file( $file ) && is_readable( $file ) )
            {
                $this->_file = $file;
                $this->_size = filesize( $file );
            }
            else
            {
                die("404 File Not Found");
            }
        }

        function SetLimit( $KbPerSec )
        {
            // For simplicity set blocksize to limit if there is one
            $this->_blocksize = $this->_limit = $KbPerSec * 1024;
            if ( $this->_limit == 0 )
            {
                // Set blocksize to 250KB if there is no limit
                $this->_blocksize = 250 * 1024;
            }
        }

        function SendHeaders()
        {
            header( "Content-Disposition: attachment; filename=".basename( $this->_file ) );
            header( "Content-Type: application/octet-stream" );
            header( "Content-Length: " . $this->_size );
            header( "X-Powered-By: ioflux.net download delivery system" );
            header( "Content-Transfer-Encoding: binary" );
            if ( $this->_limit == 0 )
            {
                header( "Accept-Ranges: bytes" );
            }
            else
            {
                header( "Accept-Ranges: none" );
            }
        }

        function Start()
        {
            // Ok start download
            $sleep = -1;
            $aborted = FALSE;
            $offset = FALSE;
            $endset = FALSE;
           
            // See if we want to resume or segment downloading
            // Only allow this if there is no bandwidth limit
            if ( $this->_limit == 0 && isset( $_SERVER['HTTP_RANGE'] ) )
            {
                // User wants to resume download
                if ( preg_match( '/^bytes=([0-9]*?)-$/', $_SERVER['HTTP_RANGE'], $m ) )
                {
                    $offset = $m[1];
                }
                else if ( preg_match( '/^bytes=([0-9]*?)-([0-9]*?)$/', $_SERVER['HTTP_RANGE'], $m ) )
                {
                    $offset = $m[1];
                    $endset = $m[2];
                }
            }
           
            if ( $offset !== FALSE )
            {
                if ( $offset > $this->_size )
                {
                    // User requested to resume beyond file size!
                    header( 'HTTP/1.0 500 Internal Server Error' );
                    exit;
                }
                // Resume download from somewhere
                fseek( $fp, $offset );
                $length -= $offset;
                if ( $endset )
                {
                    $length = $endset - $offset;
                }
            }
           
            if ( $endset == FALSE )
            {
                $endset = $length;
            }

            if ( $this->_fp = fopen( $this->_file, 'rb' ) )
            {
                $cur = 0;
                $start = time();
                while ( !feof( $this->_fp ) )
                {
                    // Get start time for this block
                    $cnts = fread( $this->_fp, $this->_blocksize );
                    $cur += strlen( $cnts );
                    echo $cnts;
                    $secs = time() - $start;
                    $Kbsec = ( $cur / $secs );
                    if ( $this->_limit != 0 && $Kbsec > $this->_limit )
                    {
                        sleep( 1 );
                    }
                    if (connection_aborted())
                    {
                        // No need to keep sending data if the client pressed abort or something
                        $aborted = TRUE;
                        break;
                    }
                }
                fclose($this->_fp);
            }
            return $aborted;
        }

    }

?>

Klasse bruges sådan:

<?php

    require_once('download.class.php');

    $file = 'En_stor_fil.zip';
    $dl = new Download;
    $dl->SetRoot('/folder/hvor/filen/er/');
    $dl->SetFile($file);
    $dl->SetLimit(25); // 25 KB/s begrænsning!
    $dl->SendHeaders();
    $dl->Start();

?>
Avatar billede rathkjen Nybegynder
31. marts 2008 - 21:06 #4
jeg syns ikk lige den vil som jeg :) der kommer fejl:

Error: Root /config/download/ does not exist

Selvom den dog findes...
Avatar billede coderdk Praktikant
31. marts 2008 - 21:19 #5
Er du sikker? Sikker på det ikke er /home/dinbruger/config/download/ ?
Prøv i toppen af et script at skrive:

die("FAKTISK ROD: " . realpath("."));
Avatar billede rathkjen Nybegynder
31. marts 2008 - 21:34 #6
Nu tror jeg måske jeg har fundet den rigtige rod, men nu kommer der en masse volapyk. ja kan lige skrive lidt af det.

PKw°6ó@9R>/Ì wrar362.exeìý xTŶ8Šï’tBC7 `„  "<"$ 4é € ¢Cd2é ( tÜ f§hEçxŽzð8'…0™è*BPD@Eœ*6h aþ¯µjw§ƒxïýþï}ï}ßûÝ@í®¹V­ªZµVÕªªÌI/I’Q²H~¿$ÕHâ/Iê'ý·p«Uê6àÝȏÖè2>¸fMvÁ¼â¸ÅE‹î+š½ n\슻gn\‘¼0N^8gnQ\Þ¼… 7w²Ýúßgþ¿ÿOü9R%)Cg”Üÿ,J ø—,º.º0°é$i¸æi ðƒÞAv=öñø•6è‚} aœökíÈ*ø—¤“Â,¤»ûÿΚý×Ã\s—¹È¦Ó‚ßðÎqâ¢asf»f£ñ€u‚ßp]§xI’T;lžóJÒ…àªS¼¤aEÅE÷¢ãn©£ÎqŒ÷­vÿû÷¿ÿ³?¾h0ôCqQ8×ä°“ÎÜìÚ®°I®h_Ä(ÌÏå¹—`öÀŽìŸ_öƒßŸïÿ؁Ÿk}à Üà_ð|d37—?
Avatar billede coderdk Praktikant
31. marts 2008 - 21:55 #7
Det ligner starten af en ZIP-fil... Det tyder på at den ikke kommer og fortæller browseren at den helst skal downloade i stedet for at vise...
Avatar billede coderdk Praktikant
31. marts 2008 - 21:58 #8
Hmm jeg har lige testet i IE7 og der lader den ikke til at vil starte downloaden... Det virker ellers i Firefox... Jeg har desværre ikke lige overskud til at se hvad der kan være galt, lige nu.
Avatar billede coderdk Praktikant
31. marts 2008 - 22:05 #9
Jo, det var sgu

header( "Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0" );

Det kan IE7 åbenbart ikke lide i dette script ;P Du kan evt. erstatte linjen med:

    header( "Cache-Control: must-revalidate, post-check=0, pre-check=0, max-age=0" );
Avatar billede rathkjen Nybegynder
31. marts 2008 - 22:08 #10
Ja så virker det! :D

Mange tak skal du have, det var jo lige perfekt!

Svar så får du point! :D
Avatar billede rathkjen Nybegynder
31. marts 2008 - 22:10 #11
Dog virker den ikke med .rar filer, er det noget du hurtig kan se, ellers så pakker jeg dem bare om til .zip filer :)
Avatar billede coderdk Praktikant
31. marts 2008 - 22:16 #12
Hmm det burde virke med alle typer filer... Prøv evt. at ændre:

header( "Content-Type: application/octet-stream" );

til:

header( "Content-Type: application/x-msdownload" );

Selvom det ikke burde have en indvirkning...
Avatar billede rathkjen Nybegynder
31. marts 2008 - 22:21 #13
Det virkede! mange tak :D herligt! hehe
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester