2009-06-08 6 views
2

Le script suivant est ce que j'utilise habituellement pour transférer les en-têtes vers le navigateur afin que la boîte de dialogue s'affiche pour permettre aux utilisateurs de télécharger un fichier.Comment faire pour télécharger des en-têtes à partir d'un fichier sur un serveur externe?

Cependant, dans ce cas, le fichier réside sur un serveur différent. Je pense que cela ne devrait faire aucune différence, mais c'est comme quand j'exécute ce script avec l'URL d'un fichier MP3 externam, il me donne un "ERREUR: Fichier non trouvé". Cependant, ce fichier existe et je peux y accéder en utilisant la même URL que celle que je passe à ce script.

Des idées pourquoi? J'apprécierais toute aide.

<?php session_start(); 

//below variable contains full path to external site where file resides 
$filename = $_SESSION['$serverURL'].'audio/'.$_SESSION['fileName'].'.mp3'; 
//below variable contains a chosen filename of the file to be downloaded 
$properFilename = $_GET['properFilename'].'.mp3'; 

// required for IE, otherwise Content-disposition is ignored 
if(ini_get('zlib.output_compression')) 
    ini_set('zlib.output_compression', 'Off'); 

// addition by Jorg Weske 
$file_extension = strtolower(substr(strrchr($filename,"."),1)); 

if($filename == "") 
{ 
    //echo "download file NOT SPECIFIED"; 
    exit; 
} elseif (! file_exists($filename)) 
{ 
    //echo "ERROR: File not found"; 
    exit; 
}; 
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; 
    default: $ctype="application/force-download"; 
} 
header("Pragma: public"); // required 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Cache-Control: private",false); // required for certain browsers 
header("Content-Type: $ctype"); 
// change, added quotes to allow spaces in filenames, by Rajkumar Singh 
header("Content-Disposition: attachment; filename=\"".basename($properFilename)."\";"); 
header("Content-Transfer-Encoding: binary"); 
header("Content-Length: ".filesize($filename)); 
readfile("$filename"); 
exit(); 

?> 

Répondre

3

cordes guillemets simples ne sont pas analysées pour les variables, donc $_SESSION['$serverURL'] est probablement ne va pas fonctionner comme prévu. Je suppose que vous voulez dire $_SESSION[$serverURL] ou $_SESSION['serverURL'].

Appelez également filesize() puis readfile() entraînera probablement votre script à faire deux requêtes HTTP pour récupérer le fichier à partir de l'autre serveur (sauf si cela est mis en cache en quelque sorte). Vous pouvez le faire dans une requête HTTP en utilisant cURL, ce qui peut être une meilleure option. Voici un bref exemple, vous devriez être capable de l'adapter pour faire ce que vous voulez. Vous pouvez également envisager de transférer d'autres en-têtes tels que l'en-tête Content-Type de l'autre serveur (si elle est fiable) plutôt que de les générer de nouveau vous-même.

<?php 

$ch = curl_init(); 

curl_setopt($ch, CURLOPT_URL, 'http://example.com'); 

//set callbacks to receive headers and content 
curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'on_receive_header'); 
curl_setopt($ch, CURLOPT_WRITEFUNCTION, 'on_receive_content'); 

//send your other custom headers somewhere like here 

if (false === curl_exec($ch)) { 
    //handle error better than this. 
    die(curl_error($ch)); 
} 

function on_receive_header($ch, $string) { 
    //You could here forward the other headers received from your other server if you wanted 

    //for now we only want Content-Length 
    if (stripos($string, 'Content-Length') !== false) { 
     header($string); 
    } 

    //curl requires you to return the amount of data received 
    $length = strlen($string); 
    return $length; 
} 

function on_receive_content($ch, $string) { 
    echo $string; 

    //again return amount written 
    $length = strlen($string); 
    return $length; 
} 
+0

Nous vous remercions de votre réponse. J'ai fait une erreur avec la variable de session. Cela aurait dû être $ _SESSION ['serverURL']. Après avoir corrigé cela, j'ai toujours eu le même problème. J'ai même supprimé la ligne envoyant la taille de fichier. Même alors, ça ne fonctionnait toujours pas! – Abs

+0

Il a effectivement fonctionné quand j'ai enlevé les conditionnels vérifiant si le fichier existe. Et j'ai ajouté les lignes ob_clean(); flush(); avant le fichier readfile(); Je vais essayer d'implémenter votre getter de taille CURL. :) – Abs

Questions connexes