Gå til innhold

Force-downloading av filer vha header()


Anbefalte innlegg

Heisann,

 

Driver å mekker en side for podcasts. Brukerene har valget mellom å spille av en podcast med flashplayer, laste ned eller via iTunes/feed. Alt fungerer så langt veldig bra.

 

Derimot opplever jeg at "Last ned"-funksjonen, bare fører til preview i quicktime (bruker mac, men skjer på pc med bl.a. quicktime), istedetfor å faktisk laste ned filen. Siden jeg allerede har flashplayer tilgjengelig for preview, er det ikkje aktuelt å få preview på nedlastningen også.

 

I den sammenheng lurer jeg på om det er mulig å "force" en nettleser til å laste ned en fil - uavhengig om quicktime vil ta preview eller ei, på lik linje med høyreklikk -> Lagre som/Last ned.

 

Her er koden som står for header()-funksjonen;

 

<?php

//include database stuff and functions
include "custom/config.php";
include "inc/database/adodb.inc.php";
include "inc/connect.php";
include "inc/functions.php";

//create some important globals
if (!isset($db['host'])) { die("<br /><br />Cannot find a valid configuration file! <a href=\"install.php\">Install Loudblog now!</a>"); }
$GLOBALS['prefix'] = $db['pref'];
$settings = getsettings();

foreach ($_GET as $themethod => $thefile) { 
   $method = "count".$themethod; 
   $file = $thefile;
}

//apache rewrite kills the double slashes of http:// let's undo this!
$file = preg_replace ("#^([a-z]{3,5})\:/([^/])#i", "$1://$2", $file);

//get the old counting value
$dosql = "SELECT ".$method.", countall FROM ".$GLOBALS['prefix']."lb_postings 
         WHERE audio_file = '". urldecode($file) ."'";
$result = $GLOBALS['lbdata']->GetArray($dosql);
$counter = $result[0][$method];
$countal = $result[0]['countall'];


if (veryempty($counter)) { $counter = 0; }
if (veryempty($countal)) { $countal = 0; }
$counter += 1;
$countal += 1;

//do the counting action
$dosql = "UPDATE ".$GLOBALS['prefix']."lb_postings SET $method = '$counter', countall = '$countal' WHERE audio_file = '".urldecode($file)."'";

$GLOBALS['lbdata']->Execute($dosql);

if(isset($method)) {
if(empty($file)) {
 die ("No File Specified");
 	}
if(strpos($file, "..") !== false) {
 die ("HACK ATTEMPT!");
}

//local or remote file?
if(strpos($file, "://") !== false) {
       $before = "";
} else {
       $before = $settings['url']."/audio/";
   }

//redirect us to the real location of the audio file
header("Location: ".$before.$file, FALSE, 302);
}

?>

Lenke til kommentar
Videoannonse
Annonse

Søk litt på Google etter php force download. Da finner du blant annet dette skriptet:

<?php
$filename = 'dummy.zip';
          $filename = realpath($filename);

          $file_extension = strtolower(substr(strrchr($filename,"."),1));

          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 "jpe": case "jpeg":
              case "jpg": $ctype="image/jpg"; break;
              default: $ctype="application/force-download";
          }

          if (!file_exists($filename)) {
              die("NO FILE HERE");
          }

          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: $ctype");
          header("Content-Disposition: attachment; filename=\"".basename($filename)."\";");
          header("Content-Transfer-Encoding: binary");
          header("Content-Length: ".@filesize($filename));
          set_time_limit(0);
          @readfile("$filename") or die("File not found."); 
?>

Lenke til kommentar

Har lest om mange av disse, men jeg er ikkje en über pr0 php-coder, så, klarer ikkje helt å få ting til å funke ved å erstatte ting og slikt.

 

Så om noen kunne gitt meg et tips om hvordan, og hva, jeg må erstatte i koden som jeg pastet i første post hadde jeg vært _EVIG_ takknemlig :)

Lenke til kommentar
Her er koden for force download:
header('Content-Disposition: attachment; filename="podcast.mp3"');
readfile('original.mp3');

Bare legg til fila som skal lastes ned i readile() ;)

5229798[/snapback]

Siden filnavnet er dynamisk, kan jeg skrive det slik da (se første post for hele koden);

//redirect us to the real location of the audio file
header('Content-Disposition: attachment; filename=".$before.$file"');
readfile('.$before.$file');

 

Eller blir det heeeeeelt feil?

Lenke til kommentar
Er nok heller

readfile($before.'.'.$file);

Forutsatt at $before = navnet på filen og $file = filendelsen uten punktum.

5230969[/snapback]

Brukte dette;

//redirect us to the real location of the audio file
header('Content-Disposition: attachment; filename=".$before.$file"');
readfile($before.'.'.$file);

 

Den gjør det rett, ved at den laster ned en fil. Denne blir dog hetende $before.$file.html, og inneholder følgende melding;

Warning: readfile(http://podcast.minside.no/audio/.filnavn.mp3): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /srv/www/podcast/inc/counting.php on line 62

 

Som dere ser, havner det et punktum forran filnavn.mp3, samtidig som den nedlastede filen får feil navn/filendelse (sikkert pga filen som det linkes til, blir feil).

Lenke til kommentar
header('Content-Disposition: attachment; filename="'.$before.$file.'"');

Virker den?

5235352[/snapback]

Kun bruke den funket ikkje.

 

Bruker jeg den, sammen med

readfile($before.'.'.$file);

 

..får eg fortsatt en .html-fil, med følgende tekst;

Warning: readfile(http://podcast.minside.no/audio/.filnavn.mp3): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /srv/www/podcast/inc/counting.php on line 62

 

...så det kommer fortsatt et punktum før selve filnavnet... :hmm:

Endret av jallakim
Lenke til kommentar
Ikke så rart, siden $before er path og $file er selve fila... ;)

Brytt ut med readfile($before.$file);

5235688[/snapback]

Genialt. Den laster hvertfall ned filen.

 

..MEN;

 

- Filen slutter med .mp3.html = får ikkje spilt den av uten videre i medieavspillere.

- Filen har filens plassering på web, som navn = http---podcast.minside.no/audio/filnavn.mp3.html

 

Hvordan fikser jeg det slik at filen som nå lastes ned, får filnavnet filnavn.mp3?

 

edit; Safari (mac) lagrer filen som .mp3.html. Camino (mac) gir den filendelsen .mp3, men når filen er 100%, sier den at filen er "korrupt". IE (pc) vil lagre filen som get.html, mens firefox (pc) klarer faktisk å laste ned filen 100% fin, bare med et langt filnavn; http---podcast.minside.no/audio/filnavn.mp3

Endret av jallakim
Lenke til kommentar
Hva med:
header('Content-Disposition: attachment; filename="'.$before.$file.'"');
readfile($before.$file);

5248478[/snapback]

Det er slik jeg prøvde, og resulatet ble som beskrevet i min forrige post.

 

Ved å kun bruke

readfile($before.$file);

laster nettleseren bare ned hashen til filen.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...