Помогите реализовать нормальную скачку mp3 файлов с сайта

Тема в разделе "PHP", создана пользователем fredis69, 21 июн 2010.

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

    fredis69 Постоялец

    Регистр.:
    25 окт 2008
    Сообщения:
    84
    Симпатии:
    2
    Здравствуйте,

    Есть сайт на котором распологаются mp3 файлы, при нажатии чтобы скачать, запускается проигрыватель QuickTime и в браузере проигрывается этот файл, как сделать чтобы этого нпроисходило, а появлялось окно для сохранения файла,

    при скачивании идет редирект на новую страницу где из бд вытаскивается путь к файлу и опять редиректится на на сам файл,

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

    помогите разобраться.

    премер: (мой скрипт)

    Страница(1:(
    PHP:
    <a href="loadings.php?id=<?=$myrow['id']?>" title="скачать <?=$myrow['title']?>">СКАЧАТЬ</a>
    Страница(2:(

    PHP:
    <?php 
    include ("addition/bd.php"); /*Соединяемся с базой данных*/

    if (isset($_GET['id'])) {$id $_GET['id'];}

    $result mysql_query("SELECT * FROM content WHERE id='$id'",$db);
    $myrow mysql_fetch_array ($result); 

           
    /*Обновляем колонку скачиваний и прибовляем 1*/
    $new_loadings $myrow['loadings'] + 1;
    $update mysql_query ("UPDATE content SET loadings='$new_loadings' WHERE id='$id'",$db);
               
    /*конец*/
    $url $myrow ['reference'];   
     
      
    $URL="files/"."$url";
    header("Location:$URL");
    exit();
    ?>
    и тут запускается проигрыватель.
     
  2. farm

    farm

    Регистр.:
    8 июн 2006
    Сообщения:
    536
    Симпатии:
    105
    Это нужно копать в сторону отдаваемых скриптом заголовков "header content-type"
     
    fredis69 нравится это.
  3. diavolic

    diavolic

    Регистр.:
    17 мар 2010
    Сообщения:
    522
    Симпатии:
    102
    PHP:
    <?php

    function dl_file($file){

        
    //First, see if the file exists
        
    if (!is_file($file)) { die("404 File not found!"); }

        
    //Gather relevent info about file
        
    $len filesize($file);
        
    $filename basename($file);
        
    $file_extension strtolower(substr(strrchr($filename,"."),1));

        
    //This will set the Content-Type to the appropriate setting for the file
        
    switch( $file_extension ) {
          case 
    "pdf"$ctype="application/pdf"; break;
          case 
    "exe"$ctype="application/octet-stream"; break;
          case 
    "zip"$ctype="application/zip"; break;
          case 
    "doc"$ctype="application/msword"; break;
          case 
    "xls"$ctype="application/vnd.ms-excel"; break;
          case 
    "ppt"$ctype="application/vnd.ms-powerpoint"; break;
          case 
    "gif"$ctype="image/gif"; break;
          case 
    "png"$ctype="image/png"; break;
          case 
    "jpeg":
          case 
    "jpg"$ctype="image/jpg"; break;
          case 
    "mp3"$ctype="audio/mpeg"; break;
          case 
    "wav"$ctype="audio/x-wav"; break;
          case 
    "mpeg":
          case 
    "mpg":
          case 
    "mpe"$ctype="video/mpeg"; break;
          case 
    "mov"$ctype="video/quicktime"; break;
          case 
    "avi"$ctype="video/x-msvideo"; break;

          
    //The following are for extensions that shouldn't be downloaded (sensitive stuff, like php files)
          
    case "php":
          case 
    "htm":
          case 
    "html":
          case 
    "txt": die("Cannot be used for "$file_extension ." files!>"); break;

          default: 
    $ctype="application/force-download";
        }

        
    //Begin writing headers
        
    header("Pragma: public");
        
    header("Expires: 0");
        
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
        
    header("Cache-Control: public");
        
    header("Content-Description: File Transfer");

        
    //Use the switch-generated Content-Type
        
    header("Content-Type: $ctype");

        
    //Force the download
        
    $header="Content-Disposition: attachment; filename=".$filename.";";
        
    header($header );
        
    header("Content-Transfer-Encoding: binary");
        
    header("Content-Length: ".$len);
        @
    readfile($file);
        exit;
    }
    ?>
    Подробнее здесь - http://www.job-blog.bullgare.ru/2009/09/%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F-header-%D0%B2-php/
     
    fredis69 нравится это.
  4. fredis69

    fredis69 Постоялец

    Регистр.:
    25 окт 2008
    Сообщения:
    84
    Симпатии:
    2
    Можете подсказать какой будет полный код 2-ой странице, а то я разобраться немогу, уже мозг кипит.

    Выводит какуюто хрень, вся страница заполняется кракозябрами до бесканечности.
     
  5. Raven109

    Raven109 Создатель

    Регистр.:
    29 янв 2007
    Сообщения:
    26
    Симпатии:
    1
    Пробуй так:

    PHP:
    <?php  
    include ("addition/bd.php");  

    if (isset(
    $_GET['id'])) {$id $_GET['id'];} 

    $result mysql_query("SELECT * FROM content WHERE id='$id'",$db); 
    $myrow mysql_fetch_array ($result);  

            
    $new_loadings $myrow['loadings'] + 1
    $update mysql_query ("UPDATE content SET loadings='$new_loadings' WHERE id='$id'",$db); 
                
    $url $myrow['reference'];    
    $url "files/".$url;

    if (!
    is_file($url)) { die("404 File not found!"); }

    $len filesize($url);
    $filename basename($url);
    header("Content-Type: audio/mpeg");
    header("Content-Disposition: attachment; filename=".$filename.";"); 
    header("Content-Length: ".$len);

    @
    readfile($url);
    ?>
     
    fredis69 нравится это.
  6. diavolic

    diavolic

    Регистр.:
    17 мар 2010
    Сообщения:
    522
    Симпатии:
    102
    fredis69, скинь на форум ссылку на свой скрипт
     
    fredis69 нравится это.
  7. Plan

    Plan Постоялец

    Регистр.:
    24 май 2010
    Сообщения:
    144
    Симпатии:
    24
    Вот рабочий код,

    PHP:
    <?php   
    include ("addition/bd.php"); if (isset($_GET['id'])) {$id $_GET['id'];}  
    $result mysql_query("SELECT * FROM content WHERE id='$id'",$db);  
    $myrow mysql_fetch_array ($result);
    $new_loadings $myrow['loadings'] + 1;  
    $update mysql_query ("UPDATE content SET loadings='$new_loadings' WHERE id='$id'",$db);  
    $url $myrow['reference'];     
    $url "files/".$url
    if (!
    is_file($url)) { die("404!"); } 
    $len filesize($url); 
    $filename basename($url); 
    header("Content-Type: audio/mpeg"); 
    header("Content-Disposition: attachment; filename=".$filename.";");  
    header("Content-Length: ".$len); 
    @
    readfile($url); 
    ?>
     
    fredis69 нравится это.
  8. fredis69

    fredis69 Постоялец

    Регистр.:
    25 окт 2008
    Сообщения:
    84
    Симпатии:
    2
    большое спасибо всё работает отлично, даже лучше чем я ожидал, страница loadings.php даже не загружается в браузер, соответственно пользователю неизвестна прямая ссылка на файл, работает отлично
     
  9. a_n_d_y

    a_n_d_y

    Регистр.:
    26 мар 2006
    Сообщения:
    465
    Симпатии:
    61
    PHP:
    if (isset($_GET['id'])) {$id $_GET['id'];}  
    $result mysql_query("SELECT * FROM content WHERE id='$id'",$db); 
    Народ вы че прикалываетесь? Без валидации и обработки сразу в запрос к базе?
    Ну ну...
     
  10. fredis69

    fredis69 Постоялец

    Регистр.:
    25 окт 2008
    Сообщения:
    84
    Симпатии:
    2
    Ну подскажи как сделать правильно. Я неочень хорошо разбираюсь в защите.

    Как надо сделать?
     
Статус темы:
Закрыта.