Avatar billede Slettet bruger
04. februar 2006 - 14:11 Der er 17 kommentarer og
1 løsning

besked når filen er halvt downloaded

Kan man lave et script der der registrerer når filen er halvt downloaded.

Jeg skal registrerer det i en database som en counter.

Hvis filen er min 50% downloaded tæller det som et download hvis ikke tæller det ikke som donwload
Avatar billede olebole Juniormester
04. februar 2006 - 14:16 #1
<ole>

Du kan ikke aftaste, hvormeget der er ankommet til browseren ... der har PHP ingen effekt

/mvh
</bole>
Avatar billede boris Mester
04. februar 2006 - 14:28 #2
Du skal formentlig have PHP til at tjekke i logfilen for serveren.
Du kan udforme din request sådan, at du identificerer brugeren.
Så er spørgsmålet, om du kan få din server til at skrive i logfilen, hvor meget en bestemt bruger downloader af en fil.
Avatar billede olebole Juniormester
04. februar 2006 - 14:38 #3
-og så kommer det anpå, hvad der menes med 'download'. Som det så ofte gælder ved spørgsmål i et hjælpeforum, er det vigtigt at give en udførlig forklaring af, hvad det er, man ønsker/prøver  ;o)
Avatar billede coderdk Praktikant
04. februar 2006 - 14:45 #4
Du kan få php til at levere downloaden, med fopen og fread i et loop. I samme loop brug connection_aborted() http://dk.php.net/connection_aborted - Så kan du selv regne ud hvornår den har nået hvad ;)
Avatar billede olebole Juniormester
04. februar 2006 - 15:00 #5
coderdk >> det var netop det, jeg sad og tænkte på - men det er jo ikke en holdbar løsning, hvis det er alle et sites dokumenter, vi taler om ... altså en slags avanceret hit-counter.
Til download af (enkelte) specielle dokumenter er det derimod en fin løsning, hvorfor jeg efterlyste en bedre forklaring på, hvad der ønskes  ;o)
Avatar billede Slettet bruger
04. februar 2006 - 15:33 #6
uddybende forklaring:


Det er til et music site hvor hvor hver user har en tilknyttet mappe med uploadede mp3 filer. Jeg vil så holder styr på hvor mange downloads de forskellige mp3er har til at lave en hitliste over hvem der har flest downloads.

For at være sikker på at folk har downloaded filen og ikke bare trykket på linket for at få counteren til at tælle vil jeg gerne have besked når en vis del af download er gennemført

Grunden til at jeg siger 50% er at jeg også skal bruge signalet til når folk streamer filen. Når folk har lyttet til 50% af sangen tæller det som en lytning

Hvis der en metode der kan fortælle hvornår filen er 100% downloadet vil jeg da gerne høre den også. Er det den samme metode
Avatar billede Slettet bruger
04. februar 2006 - 15:53 #7
Jeg hat fundet dette script på php manualen. Det skulle vist kunne fortælle når en fil er downloaded fuldt. Men jeg kan ikke få det til at virke

Jeg bliver nød til at slette den linie jeg har kommenteret ud for overhovedet at kunne køre scriptet. men så ved jeg ikke om scriptet stadig virker.

<?php
function send_file($name) {
  ob_end_clean();
  $path = $name;
  if (!is_file($path) or connection_status()!=0) return(FALSE);
############ denne line bliver jeg nød til at slette
##  header("Cache-Control: no-store, no-cache, must-revalidate");
########################################
  header("Cache-Control: post-check=0, pre-check=0", false);
  header("Pragma: no-cache");
  header("Expires: ".gmdate("D, d M Y H:i:s", mktime(date("H")+2, date("i"), date("s"), date("m"), date("d"), date("Y")))." GMT");
  header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
  header("Content-Type: application/octet-stream");
  header("Content-Length: ".(string)(filesize($path)));
  header("Content-Disposition: inline; filename=$name");
  header("Content-Transfer-Encoding: binary\n");
  if ($file = fopen($path, 'rb')) {
  while(!feof($file) and (connection_status()==0)) {
    print(fread($file, 1024*8));
    flush();
  }
  fclose($file);
  }
  return((connection_status()==0) and !connection_aborted());
}
?>
<?php
if (!send_file("tet.mp3")) {
die ("file transfer failed");
// either the file transfer was incomplete
// or the file was not found
} else {

echo "file is fully downloaded";
// the download was a success
// log, or do whatever else
}
?>
Avatar billede boris Mester
04. februar 2006 - 17:08 #8
Sådan ca. ville jeg lave det. Bare hovedtrækkene, koden må du selv strikke.
1) inden download omdøbes (kopieres) filen til f.eks. a12f45hc022bb.mp3
2) du gemmer filnavnet sammen med bruger-ID i din database
3) I serverens logfil kan du bagefter finde request for dette filnavn sammen med brugerens IP og en http-kode (f.eks. 200) og endelig størrelsen af download.
(det skulle i hvertfald være muligt på Apache)
4) Du lader PHP af læse logfilen og sammenligne download med filens størrelse
Avatar billede Slettet bruger
04. februar 2006 - 20:51 #9
jeg har fået mit script til at virke. Det gjorde ikke noget at jeg kommenterede den linie ud. Gad vide hvad den gjorde??

Det jeg gjorde for at få det til at virke var at tilføje en mysql query ved succes. Ved en 100% download returnere scriptet succes og vil så køre min query og opdatere databasen

Jeg ved dog ikke hvordan jeg skal gøre hvis jeg vil have den til at virke når folk streamer mine mp3 er.

Sagen er at jeg så sender en m3u fil til download scriptet. En sådan fil er jo hurtigt downloaded og så vil den fortælle at filen er downloadet hvad den jo egentlig også er. Men jeg ville jo have scriptet til at notere når mp3 filen var downloaded.

alså jeg sender en m3u fil til download scriptet hvad der starter en streaming af mp3 filen. Jeg har så brug for en funktion der fortæller mig hvornår lytteren har streamet 50% af filen hvad der tæller som en lytning

....er det mon muligt

Hej boris....Det kan være jeg skal bruge din metode. Jeg synes bare det er lidt træls at jeg bliver nød til at kopiere filen.
Avatar billede coderdk Praktikant
04. februar 2006 - 21:02 #10
Kan du ikke benytte samme metode? .m3u filen indeholder vel en reference til mp3-filen på nettet? Du kan vel lade et php-script levere denne mp3?
Avatar billede Slettet bruger
04. februar 2006 - 21:05 #11
Hej coder dk
Jeg tror du har ret

Iøvrigt tror jeg ikke jeg har adgang til logfiler på min server. Jeg kan i hvert fald ikke finde noget der har med "log" at gøre. Hvor skulle de ligge hvis de er der??
Avatar billede Slettet bruger
04. februar 2006 - 21:11 #12
coder dk du havde ret det virker perfekt

Så er der kun et problem tilbage. Jeg har fundet ud af hvordan jeg får opdateret databasen når sangen er 100% downloadet

Nu ville jeg gerne have at den opdatere databasen når sangen er 50% downloadet og så forsætter med at downloade
Avatar billede coderdk Praktikant
04. februar 2006 - 21:21 #13
Hvad med noget i stil med:

$updated = false;
$bytes = 0;
$fsize = filesize( ...din fil... );
while (...læs din fil...)
{
  $bytes += 1024*8; // Det du også bruger på fread()
  if ( !$updated && $bytes >= ( $fsize / 2 ) )
  {
      $updated = true;
      // Opdatér databasen
  }
}
Avatar billede Slettet bruger
04. februar 2006 - 21:46 #14
Hey coder mange mange tak
vil du ikke nok vise hvor det skal indsættes i mit script. Jeg kan ikke rigtig finde ud af hvor det skal tilføjes og om jeg skal slette noget af det jeg har
Avatar billede coderdk Praktikant
04. februar 2006 - 22:55 #15
<?php

    function send_file( $name )
    {
        ob_end_clean();
        $path = $name;
        if ( !is_file( $path ) || connection_status() != 0 )
            return false;

        header( "Cache-Control: post-check=0, pre-check=0" );
        header( "Pragma: no-cache" );
        header( "Expires: " .
            gmdate( "D, d M Y H:i:s", strtotime( '+2 hours' ) . " GMT" );
        header( "Last-Modified: " . gmdate( "D, d M Y H:i:s" ) . " GMT" );
        header( "Content-Type: application/octet-stream" );
        header( "Content-Length: " . filesize( $path ) );
        header( "Content-Disposition: inline; filename=\"" .
            basename( $name ) . "\" );
        header( "Content-Transfer-Encoding: binary\n" );
        if ( $file = fopen( $path, 'rb' ) )
        {
            $updated = false;
            $bytes = 0;
            $fsize = filesize( $path );
            while( !feof( $file ) && ( connection_status() == 0 ) )
            {
                print( fread( $file, 1024*8 ) );
                $bytes += 1024*8;
                if ( !$updated && $bytes >= ( $fsize / 2 ) )
                {
                    $updated = true;
                    // 50% opnået - Opdatér databasen
                }
                flush();
            }
            fclose( $file );
        }
        return ( connection_status() == 0) and !connection_aborted());
    }

    if ( !send_file( "tet.mp3" ) )
    {
        die( "file transfer failed" );
        // either the file transfer was incomplete
        // or the file was not found
    }
    else
    {
        echo "file is fully downloaded";
        // the download was a success
        // log, or do whatever else
    }

?>
Avatar billede Slettet bruger
04. februar 2006 - 23:30 #16
hej igen. Jeg kan altså ikke få det til at virke. Hvis du vil gi det et kig vil jeg være meget taknemmelig

<?php

    function send_file( $name )
    {
        ob_end_clean();
        $path = $name;
        if ( !is_file( $path ) || connection_status() != 0 )
            return false;

        header( "Cache-Control: post-check=0, pre-check=0" );
        header( "Pragma: no-cache" );
      header("Expires: ".gmdate("D, d M Y H:i:s", mktime(date("H")+2, date("i"), date("s"), date("m"), date("d"), date("Y")))." GMT");
        header( "Last-Modified: " . gmdate( "D, d M Y H:i:s" ) . " GMT" );
        header( "Content-Type: application/octet-stream" );
        header( "Content-Length: " . filesize( $path ) );
        header( "Content-Disposition: inline; filename=\"" .basename( $name ) ."\"");
        header( "Content-Transfer-Encoding: binary\n" );
        if ( $file = fopen( $path, 'rb' ) )
        {
            $updated = false;
            $bytes = 0;
            $fsize = filesize( $path );
            while( !feof( $file ) && ( connection_status() == 0 ) )
            {
                print( fread( $file, 1024*8 ) );
                $bytes += 1024*8;
                if ( !$updated && $bytes >= ( $fsize / 2 ) )
                {
                    $updated = true;
                    // 50% opnået - Opdatér databasen
                    ##########################################
            include('mysql.php');
#inserter til database
$resultat = mysql_query("SELECT *  FROM `sims_sangid` ");
// Kør så igennem for hver række
while ($raekke = mysql_fetch_array($resultat)) {
    echo $raekke['downloads'];
      #vi skal +1
  $ny=$raekke['downloads']+1;
      }
$insertSQL= "UPDATE sims_sangid SET downloads=$ny WHERE sangid=4";
mysql_query($insertSQL);
############################################
                               
                }
                flush();
            }
            fclose( $file );
        }
  return((connection_status()==0) and !connection_aborted());
    }

  ############################
##Download section
#get information fra sidste side

$sangid= $_GET['sangid'] ;
$mappeid=$_GET['mappeid'] ;

#download link bliver så
"users/".$mappeid."/".$sangid."";
$filename = "users/".$mappeid."/".$sangid."";
$shortname = basename( $filename );

#########midlertidige variabler
$filename="tet.mp3";


if (!send_file($filename )) {
die ("file transfer failed");
// either the file transfer was incomplete
// or the file was not found




} else {



echo "file is fully downloaded";
// the download was a success
// log, or do whatever else
}
?>
Avatar billede Slettet bruger
05. februar 2006 - 01:26 #17
jeg tror jeg fik det til at virke. Jeg ved ikke helt hvad der gik galt men nu virker det

Der var nogle småfejl jeg har rettet

her er det hvis andre skulle få brug for det

...........................................................
<?php


       

    function send_file( $name )
    {
        ob_end_clean();
        $path = $name;
        if ( !is_file( $path ) || connection_status() != 0 )
            return false;

        header( "Cache-Control: post-check=0, pre-check=0" );
        header( "Pragma: no-cache" );
header("Expires: ".gmdate("D, d M Y H:i:s", mktime(date("H")+2, date("i"), date("s"), date("m"), date("d"), date("Y")))." GMT");        header( "Last-Modified: " . gmdate( "D, d M Y H:i:s" ) . " GMT" );
        header( "Content-Type: application/octet-stream" );
        header( "Content-Length: " . filesize( $path ) );
        header( "Content-Disposition: inline; filename=\"" .basename( $name ) . "\"" );
        header( "Content-Transfer-Encoding: binary\n" );
        if ( $file = fopen( $path, 'rb' ) )
        {
            $updated = false;
            $bytes = 0;
            $fsize = filesize( $path );
            while( !feof( $file ) && ( connection_status() == 0 ) )
            {
                print( fread( $file, 1024*8 ) );
                $bytes += 1024*8;
                if ( !$updated && $bytes >= ( $fsize / 2 ) )
                {
                    $updated = true;
                    // 50% opnået - Opdatér databasen
                    // 50% opnået - Opdatér databasen
                    ##########################################
            include('mysql.php');
#inserter til database
$resultat = mysql_query("SELECT *  FROM `sims_sangid` WHERE sangid=4 ");
// Kør så igennem for hver række
while ($raekke = mysql_fetch_array($resultat)) {

  echo $raekke['downloads'];
 
  #vi skal +1
  $ny=$raekke['downloads']+1;
 
  }




$insertSQL= "UPDATE sims_sangid SET downloads=$ny WHERE sangid=4";

mysql_query($insertSQL);

                   
############################################
                   
                }
                flush();
            }
            fclose( $file );
        }
        return (( connection_status() == 0) and !connection_aborted());
    }
   
    ############################################
    ############################
##Download section
#get information fra sidste side

$sangid= $_GET['sangid'] ;
$mappeid=$_GET['mappeid'] ;

#download link bliver så
"users/".$mappeid."/".$sangid."";
$filename = "users/".$mappeid."/".$sangid."";
$shortname = basename( $filename );

   


    if ( !send_file( $filename ) )
    {
        die( "file transfer failed" );
        // either the file transfer was incomplete
        // or the file was not found
    }
    else
    {
        echo "file is fully downloaded";
        // the download was a success
        // log, or do whatever else
       
           
    }


?>
Avatar billede Slettet bruger
05. februar 2006 - 01:26 #18
Mange Mange tak til jer for den gode hjælp
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