2013-01-23 3 views
1

Je l'jquery suivante:Télécharger réponse file_get_content

$(".download").click(function(){  
    $.post('get_bot.php', "url_code="+url_code, function (response) { 
    alert(response); 
    }); 
}); 

url_code est une variable qui a l'URL pour une structure JSON, voici un exemple en direct du retour: https://services.sapo.pt/Codebits/botmake/01,02,03,04,05,06,07,08,I%20Rule!

Ces chiffres sont des paramètres permettant de générer différentes images.

Sur ma page get_bot.php que je fais:

$urlc=$_POST['url_code']; 
$bot = file_get_contents($urlc); 
header("content-type: image/png"); 
echo $bot; 

Je cherche les moyens sur la façon d'obtenir une réponse en téléchargement .png, alors quand l'utilisateur clique .DOWNLOAD il y a une fenêtre de téléchargement avec le fichier .png.

passage dans une URL correcte et faisant écho aux résultats de file_get_content semble fonctionner très bien (mais si je tente de clic droit et enregistrer l'image, il enregistre en fait le fichier php ...)

Toute aide sur ce point être génial, je ne suis pas très expérimenté avec les structures json, jusqu'à présent je n'ai traité qu'avec des structures de tableaux, jamais une sortie d'image.

Je suis conscient que je suis probablement loin ici pour obtenir un résultat réel, mais n'importe quel pointeur serait apprécié.

+0

Pourquoi ne pas utiliser cette URL directement lorsque le PHP ne fait rien sauf retourner le contenu de l'URL? –

+0

Pourquoi ne pas rediriger vers l'URL? Utilisez 'header (" Location: ". $ Urlc);' sur la deuxième ligne – ksg91

Répondre

4

RFC2616 décrit ce que vous devez faire. Fondamentalement, vous devez ajouter

Content-Disposition: attachment; filename="fname.ext" 

Pour l'en-tête si je ne me trompe pas.

EDIT Voici un exemple de script. J'ai confirmé que cela fonctionne sur deux de mes serveurs avec des configurations différentes.

<?php 
    header("content-type: image/jpg"); 
    header("Content-Disposition: attachment; filename='pic.jpg'"); 
    readfile('http://lorempixel.com/400/200/'); 
?> 
+0

Just header ('Content-Disposition: attachment; filename = "picture.png"'); et écho $ bot après? Ne pas obtenir une réponse de téléchargement de fichier. –

+0

Je viens de tester cela, et ça marche pour moi. Assurez-vous que si vous utilisez des guillemets dans 'header (" ")', utilisez des guillemets simples autour de 'filename = ''' pour éviter les erreurs de syntaxe. – jurgemaister

+0

Merci, cela fonctionne en n'utilisant pas ajax du tout, je pointe l'utilisateur à get_bot? Bot = (nombre params ici) et utiliser $ _GET pour récupérer les paramètres. –

0

Il suffit d'utiliser cette fonction sur votre get_bot.php pour lancer un téléchargement d'un fichier au lieu de le montrer dans le navigateur (devrait fonctionner cross-browser):

function download($file, $path) 
{ 
    $size = filesize($path.$file); 

    @ob_end_clean(); 

    if(ini_get('zlib.output_compression')) 
    ini_set('zlib.output_compression', 'Off'); 

    header('Content-Type: application/force-download'); 
    header('Content-Disposition: attachment; filename="'.basename($file).'"'); 
    header("Content-Transfer-Encoding: binary"); 
    header('Accept-Ranges: bytes'); 
    header("Cache-control: no-cache, pre-check=0, post-check=0"); 
    header("Cache-control: private"); 
    header('Pragma: private'); 
    header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); 

    if(isset($_SERVER['HTTP_RANGE'])) 
    { 
     list($a, $range) = explode("=",$_SERVER['HTTP_RANGE'],2); 
     list($range) = explode(",",$range,2); 
     list($range, $range_end) = explode("-", $range); 
     $range=intval($range); 
     if(!$range_end) { 
      $range_end=$size-1; 
     } else { 
      $range_end=intval($range_end); 
     } 

     $new_length = $range_end-$range+1; 
     header("HTTP/1.1 206 Partial Content"); 
     header("Content-Length: $new_length"); 
     header("Content-Range: bytes $range-$range_end/$size"); 
    } else { 
     $new_length=$size; 
     header("Content-Length: ".$size); 
    } 

    $chunksize = 1*(1024*1024); 
    $bytes_send = 0; 
    if ($file = fopen($path.$file, 'rb')) 
    { 
     if(isset($_SERVER['HTTP_RANGE'])) 
     fseek($file, $range); 

     while 
      (!feof($file) && 
      (!connection_aborted()) && 
      ($bytes_send<$new_length)) 
     { 
      $buffer = fread($file, $chunksize); 
      print($buffer); 
      flush(); 
      $bytes_send += strlen($buffer); 
     } 
    fclose($file); 
    } else die('Error - can not open file.'); 

die(); 
} 
Questions connexes