[PHP] Przerobienie klasy (Wrzuta)

0

Witam.
Na razie się uczę podstaw PHP, ale niestety jeszcze nie doszedłem do tego, aby przerobić odpowiednio poniższą klasę.
Chciałbym, aby do pobieranego pliku została dodawana końcówka ".mp3"
Czy jest to możliwe?

Z góry dziękuje za pomoc i pozdrawiam.

<?php
    /**
     * Skrypt automatycznego pobierania plików z serwisu Wrzuta.pl
     * @author Michał "Bełdzio" Ławicki
     * @copyright Copyright &copy; 2007, Michał "Bełdzio" Ławicki
     * @link http://www.beldzio.com/
    **/
    class Wrzuta
    {
        /**
         * Pobranie pliku
         * @param string $url Adres strony z plikiem
        **/
        public function execute( $url )
        {
            if( !preg_match( '#.*?wrzuta.pl/(audio|film)/([A-z0-9]+)/.*#', $url, $data ) )
            {
                throw new Exception( 'Podany adres nie jest poprawny.' );
            }

            // Wybór adresu na podstawie typu pliku
            switch( $data[1] )
            {
                case 'audio':
                    $url = 'http://www.wrzuta.pl/aud/file/';
                break;

                case 'film':
                    $url = 'http://www.wrzuta.pl/vid/file/';
                break;
            }

            // Przekierowanie na adres umożliwiający pobranie pliku.
            header( 'Location: ' . $url . $data[2] );
        }
    }

    $oWrzuta = new Wrzuta( );
    try
    {
        $oWrzuta -> execute( $_POST['adres'] );
    }
    catch( Exception $ex )
    {
        die( $ex -> getMessage( ) );
    }

?> 
0
    /**
     * Skrypt automatycznego pobierania plików z serwisu Wrzuta.pl
     * @author Michał "Bełdzio" Ławicki
     * @copyright Copyright &copy; 2007, Michał "Bełdzio" Ławicki
     * @link http://www.beldzio.com/
    **/
    class Wrzuta
    {
        /**
         * Pobranie pliku
         * @param string $url Adres strony z plikiem
        **/
        public function execute( $url )
        {
            if( !preg_match( '#.*?wrzuta.pl/(audio|film)/([A-z0-9]+)/.*#', $url, $data ) )
            {
                throw new Exception( 'Podany adres nie jest poprawny.' );
            }

            // Wybór adresu na podstawie typu pliku
            switch( $data[1] )
            {
                case 'audio':
                    $url = 'http://www.wrzuta.pl/aud/file/';
                break;

                case 'film':
                    $url = 'http://www.wrzuta.pl/vid/file/';
                break;
            }

            header("Pragma: public");
            header("Expires: 0");
            header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
            header("Cache-Control: private", false);
            header("Content-Type: application/force-download");
            header("Content-Disposition: attachment; filename='audio.mp3'");
            header("Content-Transfer-Encoding: binary");

            // Przekierowanie na adres umożliwiający pobranie pliku.
            readfile($url . $data[2]);
        }
    }

    $oWrzuta = new Wrzuta( );
    try
    {
        $oWrzuta -> execute( $_POST['adres'] );
    }
    catch( Exception $ex )
    {
        die( $ex -> getMessage( ) );
    }
0
            header("Pragma: public");
            header("Expires: 0");
            header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
            header("Cache-Control: private", false);
            header("Content-Type: application/force-download");
            header("Content-Disposition: attachment; filename='audio.mp3'");
            header("Content-Transfer-Encoding: binary");

            // Przekierowanie na adres umożliwiający pobranie pliku.
            readfile($url . $data[2]);

Dajesz mu takie coś i nie wytłumacysz nawet co zrobiłeś...
Ba, nawet komentarza nie zmieniłeś, teraz to nigdzie nie przekierowuje, tylko czyta i zwraca plik z podanego adresu...
swoją drogą, taki skrypt może się wykonywać dłużej niż max_execution_time, jeśli ma jakąś kulawą sieć...
I skąd pewność, że on to odpala na maszynie lokalnej... jeśli tak nie jest, to to jest cholernie durny sposób...

edit: lepiej tak

<?php
    /**
     * Skrypt automatycznego pobierania plików z serwisu Wrzuta.pl
     * @author Michał "Bełdzio" Ławicki
     * @copyright Copyright &copy; 2007, Michał "Bełdzio" Ławicki
     * @link http://www.beldzio.com/
    **/
    class Wrzuta
    {
        /**
         * Pobranie pliku
         * @param string $url Adres strony z plikiem
        **/
        public function execute( $url )
        {
            if( !preg_match( '#.*?wrzuta.pl/(audio|film)/([A-z0-9]+)/.*#', $url, $data ) )
            {
                throw new Exception( 'Podany adres nie jest poprawny.' );
            }

            // Wybór adresu na podstawie typu pliku
            switch( $data[1] )
            {
                case 'audio':
                    $url = 'http://www.wrzuta.pl/aud/file/';
                    $extention = '.mp3';
                break;

                case 'film':
                    $url = 'http://www.wrzuta.pl/vid/file/';
                    $extention = '.avi'; // czy coś podobnego... a może wcale
                break;
            }

            // Przekierowanie na adres umożliwiający pobranie pliku.
            header( 'Location: ' . $url . $data[2] . $extention );
        }
    }

    $oWrzuta = new Wrzuta( );
    try
    {
        $oWrzuta -> execute( $_POST['adres'] );
    }
    catch( Exception $ex )
    {
        die( $ex -> getMessage( ) );
    }

?> 
0

Dzięki chłopaki za odpowiedzi.
Demonical Monk, twój kod działa, jednakże nie przepisuje nazw plików z wrzuty, tylko po prostu pobiera plik "audio.mp3"
Keraj, twój kod niestety nie działa, próbowałem i przekierowywuje na "wrzuta.pl" przy pobraniu.

BTW. skrypt odpalam na darmowym serwerze z php.

Ma ktoś może jeszcze jakieś pomysły?:)

Pozdrawiam i dzięki z góry

0

Haha. Właśnie na to czekałem - aż ktoś mnie nauczy i się skompromituje ^^

    /**
     * Skrypt automatycznego pobierania plików z serwisu Wrzuta.pl
     * @author Michał "Bełdzio" Ławicki
     * @copyright Copyright &copy; 2007, Michał "Bełdzio" Ławicki
     * @link http://www.beldzio.com/
    **/
    class Wrzuta
    {
        /**
         * Pobranie pliku
         * @param string $url Adres strony z plikiem
        **/
        public function execute( $url )
        {
            if( !preg_match( '#.*?wrzuta.pl/(audio|film)/([A-z0-9]+)/.*#', $url, $data ) )
            {
                throw new Exception( 'Podany adres nie jest poprawny.' );
            }

            @set_time_limit(0);

            // Wybór adresu na podstawie typu pliku
            switch( $data[1] )
            {
                case 'audio':
                    $url = 'http://www.wrzuta.pl/aud/file/';
                    $extension = '.flv';
                break;

                case 'film':
                    $url = 'http://www.wrzuta.pl/vid/file/';
                    $extension = '.mp3';
                break;
            }

            header("Pragma: public");
            header("Expires: 0");
            header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
            header("Cache-Control: private", false);
            header("Content-Type: application/force-download");
            header("Content-Disposition: attachment; filename='".$data[2].$extension."'");
            header("Content-Transfer-Encoding: binary");

            // Pobieramy plik na serwer, a potem wysyłamy do klienta
            readfile($url . $data[2]);
        }
    }

    $oWrzuta = new Wrzuta( );
    try
    {
        $oWrzuta -> execute( $_POST['adres'] );
    }
    catch( Exception $ex )
    {
        die( $ex -> getMessage( ) );
    }

Powinno działać. Dodałem wydłużanie timeoutu i przepisywanie nazw adekwatnie do typu: audio/mp3. Do pana mądralińskiego: pisze się extension.

0

Demonical Monk, dzięki za odpowiedź.
Kod faktycznie działa, pobiera plik i dodaje do niego odpowiednią końcówkę, ale nie pobiera właściwej nazwy pliku np. przy poniższym linku skrypt pobiera nazwę z:
http://kisslevy.wrzuta.pl/audio/9jxQB8evTW/dj_tiesto_-elements_of_life
i plik ma tytuł 9jxQB8evTW.mp3
lecz nie z
http://kisslevy.wrzuta.pl/audio/9jxQB8evTW/dj_tiesto
-_elements_of_life

Da radę coś na to poradzić? Może skopiować coś z oryginalnej klasy?
Pozdrawiam

0

Ups... gafa.
Powinno być tak:

header("Content-Disposition: attachment; filename='".$data[3].$extension."'");
0

Po dodaniu powyższej linijki tytuł w ogóle nie jest pobierany, a sam plik o nazwie ".mp3"
Hmmm, jakieś sugestie?

Pozdrawiam

0
Demonical Monk napisał(a)

Haha. Właśnie na to czekałem - aż ktoś mnie nauczy i się skompromituje ^^

Ja nikogo nie chciałem uczyć...
Gafa, ale już łapię czemu pobierasz plik i wysyłasz do użytkownika...
nie ważne jaką nazwę podamy, wrzuta narzuca nazwę pliku w headersach...

Swoją drogą to chyba na odwrót, audio to mp3, a film to flv.

                case 'audio':
                    $url = 'http://www.wrzuta.pl/aud/file/';
                    $extension = '.mp3';
                break;

                case 'film':
                    $url = 'http://www.wrzuta.pl/vid/file/';
                    $extension = '.flv';
                break;

A $data[3] nie będzie istnieć, jeśli nie będzie trzeciej grupy...

if( !preg_match( '#.*?wrzuta.pl/(audio|film)/([A-z0-9]+)/(.*)#', $url, $data ) )

Enyłej, no, przyznaję się... czasem nie myślę.

0

Też fakt, ale tego akurat nie zakładam ;)

0

Ok, działa dobrze. Dzięki chłopaki za pomoc.
Piwko dla was :))

Edit:
Jeszcze mam jedno pytanko.
Mam plik index.php który obsługuje formularz i przesyła informacje do pliku "przetworz.php"
który ma w sobie troche HTMLa typu:

<html>
<meta>
...
</meta>
<body>
<p>Dziękujemy za pobranie pliku. Link znajduje się poniżej.</p>
TUTAJ KOD KLASY PHP
</body>
</html>

Jak zrobić tak, aby index.php przekierowywał na przetworz.php, gdzie znajduje się link, a nie od razu pobierał pliku?

Coś jak na www.wrzuta.mpromo.pl

Pozdrawiam i dzięki z góry

0
    /**
     * Skrypt automatycznego pobierania plików z serwisu Wrzuta.pl
     * @author Michał "Bełdzio" Ławicki
     * @modified by Demonical Monk
     * @copyright Copyright &copy; 2007, Michał "Bełdzio" Ławicki
     * @link http://www.beldzio.com/
    **/

//START

    if ($_GET['get']) {
            $cfg = base64_decode(unserialize($_GET['get']));
            $url = $cfg['url'];
            $data[3] = $cfg['data3'];
            $data[2] = $cfg['data3'];
            $extension = $cfg['ext'];
            header("Pragma: public");
            header("Expires: 0");
            header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
            header("Cache-Control: private", false);
            header("Content-Type: application/force-download");
            header("Content-Disposition: attachment; filename='".$data[3].$extension."'");
            header("Content-Transfer-Encoding: binary");

            // Pobieramy plik na serwer, a potem wysyłamy do klienta
            readfile($url . $data[2]);
            exit;
    }

    class Wrzuta
    {
        /**
         * Pobranie pliku
         * @param string $url Adres strony z plikiem
        **/
        public function execute( $url )
        {
            if( !preg_match( '#.*?wrzuta.pl/(audio|film)/([A-z0-9]+)/(.*)#', $url, $data ) )
            {
                throw new Exception( 'Podany adres nie jest poprawny.' );
            }

            @set_time_limit(0);

            // Wybór adresu na podstawie typu pliku
            switch( $data[1] )
            {
                case 'audio':
                    $url = 'http://www.wrzuta.pl/aud/file/';
                    $extension = '.mp3';
                break;

                case 'film':
                    $url = 'http://www.wrzuta.pl/vid/file/';
                    $extension = '.flv';
                break;
            }

            $cfg['url'] = $url;
            $cfg['data3'] = $data[3];
            $cfg['data3'] = $data[2];
            $cfg['ext'] = $extension;
            echo('Twoj plik znajduje sie pod adresem:<br>http://***/?get='.base64_encode(serialize($cfg)));
        }
    }

//END

    $oWrzuta = new Wrzuta( );
    try
    {
        $oWrzuta -> execute( $_POST['adres'] );
    }
    catch( Exception $ex )
    {
        echo($ex -> getMessage( ));
    }

Dane są serializowane i kodowane base64. Później jeśli wykryto obecność zmiennej GET, to odkodowuje się jej treść i przekieruje do downloadu. Nie wiem czy nie wymaga ten kod poprawek, ale to zobaczysz. Fragment od *START do *END, MUSZĄ zostać zaincludowane przed wysłaniem czegokolwiek do serwera, ale to chyba oczywiste. To co jest za //END może zostać użyte kiedy zechcesz.

1 użytkowników online, w tym zalogowanych: 0, gości: 1