下载file_get_contents响应

时间:2013-01-23 12:49:06

标签: php jquery

我有以下jquery:

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

url_code是一个包含json结构url的变量,这里是return的实例: https://services.sapo.pt/Codebits/botmake/01,02,03,04,05,06,07,08,I%20Rule

这些数字是生成不同图像的参数。

在我的get_bot.php页面上,我正在做:

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

我正在研究如何以.png文件下载方式获取响应,因此当用户点击.download时,会出现一个带有.png文件的下载窗口提示。

传入正确的url并回显file_get_content结果似乎工作正常(尽管如果我尝试右键单击并保存图像,它实际上会保存php文件...)

对此有任何帮助都很棒,我对json结构不是很有经验,到目前为止我只处理数组结构,而不是图像输出。

我知道我可能会在这里获得实际结果,但任何指针都会受到赞赏。

2 个答案:

答案 0 :(得分:4)

RFC2616描述了您需要做的事情。基本上,您需要添加

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

如果我没弄错的话,到标题。

修改 这是一个示例脚本。我已经确认这可以在我的两台具有不同设置的服务器上运行。

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

答案 1 :(得分:0)

只需在get_bot.php上使用此功能即可开始下载文件而不是在浏览器中显示(应该跨浏览器工作):

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();
}