Как скачать .mp3 по ссылке

Тема в разделе "Как сделать...", создана пользователем foshechka, 22 дек 2014.

  1. foshechka

    foshechka

    Регистр.:
    24 мар 2009
    Сообщения:
    646
    Симпатии:
    109
    Доброго времени суток!
    Есть ссылка типа:

    Подскажите, пожалуйста, как правильно сделать, чтобы при нажатии на нее
    появлялось окно с предложением сохранить "'артист'-'название песни'.mp3" файл?
    А то сейчас при нажатии открывается новая вкладка и воспроизводится трек.
     
  2. Twix007

    Twix007 Нарушитель

    Регистр.:
    11 окт 2009
    Сообщения:
    213
    Симпатии:
    49
    установить vkopt chrome
     
  3. yaski

    yaski

    Регистр.:
    21 фев 2010
    Сообщения:
    474
    Симпатии:
    277
    Для firefox плагин savefrom
     
  4. zaxap83

    zaxap83 Постоялец

    Регистр.:
    6 дек 2010
    Сообщения:
    87
    Симпатии:
    28
    Вы хотите где-то у себя на сайте разместить подобные ссылки?
     
  5. foshechka

    foshechka

    Регистр.:
    24 мар 2009
    Сообщения:
    646
    Симпатии:
    109
    Ребята, мне нужно сделать это в коде на сайте. Подскажите, как это сделать?
    Без использования посторонних плагинов в браузерах.
     
  6. kise97

    kise97 Создатель

    Регистр.:
    22 июн 2012
    Сообщения:
    16
    Симпатии:
    2
    Вам нужно готовый код написать или просто подсказать как реализовать? Если как реализовать, то вот так: на входе есть название автора и композиции, ссылка на песню. Далее все это передаем в скрипт обработчик-ретранслятор, который будет в реальном времени скачивать контент по ссылке и отдавать на скачивание юзеру. Вот и все.

    А сделать так, чтобы можно было скачать без ретранслятора нельзя. Хотя в принципе можно на flash сделать, наверное.
     
  7. foshechka

    foshechka

    Регистр.:
    24 мар 2009
    Сообщения:
    646
    Симпатии:
    109
    Уважаемый, а можно теперь весь ваш текст написать в коде?:ah:
     
  8. zaxap83

    zaxap83 Постоялец

    Регистр.:
    6 дек 2010
    Сообщения:
    87
    Симпатии:
    28
    Надеюсь вы освоили VK api, создали там свое приложение и ссылки получаете именно через него, иначе вся затея не имеет смысла. Предположим, что да - мало того, что VK генерирует не долго живущие файлы и ссылка не будет вечной (для этого и нужен апи), так еще и получить по ней файл может только запросивший, т.е. если ваш сервер отправлял запрос на VK, то песня будет доступна только ему. Можно воспользоваться методом, предложенным выше, т.е. скачивать файл на сервер и уже отдавать пользователю, но так и дольше и не удобней. Я реализовал другим способом - использовал PHProxy, с помощью которого можно сразу отдавать файл пользователю, без предварительного скачивания, а в моем случае еще и сразу начать воспроизводить песню в плеере на странице. Трафик конечно все равно будет идти через свой сервер, но задержек при этом уже не будет.
    Хотите кода? Тут в пару строк не решается...
    Простой класс для взаимодействия с VK
    PHP:
    class vkapi {
        var 
    $api_secret;
        var 
    $app_id;
        var 
    $api_url;
        var 
    $token;

        function 
    vkapi($app_id$api_secret$api_url 'api.vk.com/method'$token) {
            
    $this->app_id $app_id;
            
    $this->token $token;
            
    $this->api_secret $api_secret;
            if (!
    strstr($api_url'https://')) $api_url 'https://'.$api_url;
            
    $this->api_url $api_url;
        }

        function 
    api($method,$params=false) {
            if (!
    $params$params = array();
            
    $params['api_id'] = $this->app_id;
            
    $params['v'] = '5.24';
            
    //$params['method'] = $method;
            
    $params['timestamp'] = time();
            
    $params['format'] = 'json';
            
    $params['random'] = rand(0,10000);
            
    $params['access_token'] = $this->token;
            
    ksort($params);
            
    $sig '';
            foreach(
    $params as $k=>$v) {
                
    $sig .= $k.'='.$v;
            }
            
    $sig .= $this->api_secret;
            
    $params['sig'] = md5($sig);
            
    $query $this->api_url.'/'.$method.'?'.$this->params($params);
            
    $res file_get_contents($query);
            return 
    json_decode($restrue);
            
    //echo $query.'<br>';
        
    }

        function 
    params($params) {
            
    $pice = array();
            foreach(
    $params as $k=>$v) {
                
    $pice[] = $k.'='.urlencode($v);
            }
            return 
    implode('&',$pice);
        }
    }
    Файл download.php на который передается запрос, т.е. ссылка будет иметь вид "http://mysite.com/download.php?song_id=37950134_321487620", т.е. передаем файлу только id песни, все остальное он сделает сам
    PHP:
    require_once('vk-class.php' );
    $proxy_path '/ph/index.php'//путь к прокси

    function vkh_download_mp3($song_id) { //в $song_id передается id песни вида ownerid_songid
        
    $api_id get_vk_params('api_id');
        
    $secret_key get_vk_params('api_key');
        
    $token get_vk_params('token');

        
    $mid_arr explode('_'$song_id);
        
    $owner_id $mid_arr[0];
        
    $mid $mid_arr[1];

        
    $VK = new vkapi($api_id$secret_key'api.vk.com/method'$token);
        
    $type 'audio_ids';
     
        
    $song_arr $VK->api('audio.get', array('owner_id'=>$owner_id$type=>$mid));
        
    $out = array();
        foreach(
    $song_arr['response']['items'] as $song)
            {
                
    $song['name'] = $song['artist'].' - '.$song['title'].'.mp3'//формируем название файла
                
    $song['oid'] = $owner_id.'_'.$song['id'];
                
    $song_pre_arr explode('?',str_replace(array('http://''https://'), array('',''), $song['url']));
                
    $song_pre $song_pre_arr[0];
                
    $song['url'] = site_url().$proxy_path.'?q='.$song_pre;
                
    $out[] = $song;
            }

        return 
    $out;
    }
    //echo 'ok';

    if(isset($_REQUEST['song_id']) && $_REQUEST['song_id'] != '')
        {
     
            
    $song_arr vkh_download_mp3($_REQUEST['song_id']);
            
    $furl $song_arr[0]['url'];
            
    //echo $furl.'--';
     
            
    $fname $song_arr[0]['name'];
            
    $Headers = @get_headers($furl);

     
            if(
    strstr($Headers[0], '200')) {
                
    //echo 'ok';
         
                
    header('Content-Description: File Transfer');
                
    header('Content-Type: audio/mpeg');
                
    header('Content-Disposition: attachment; filename="'.$fname.'"');
                
    header('Content-Transfer-Encoding: binary');
                
    header('Expires: 0');
                
    header('Cache-Control: must-revalidate');
                
    header('Pragma: public');
                
    header($Headers[11]);
                
    ob_clean();
                
    flush();
                
    readfile($furl);
                exit;
         
            }
     
        }
    Это почти готовое решение в вашем случае, тут нет только процедуры получения токена (get_vk_params в коде).
     
    Последнее редактирование: 24 дек 2014
  9. foshechka

    foshechka

    Регистр.:
    24 мар 2009
    Сообщения:
    646
    Симпатии:
    109