2

我有以下jQuery:

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

url_code 是一个具有 json 结构的 url 的变量,这是一个返回的实时示例: https://services.sapo.pt/Codebits/botmake/01,02,03,04,05,06,07, 08,我%20规则

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

在我的 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 结构不是很有经验,到目前为止我只处理过数组结构,从不处理图像输出。

我知道我可能无法获得实际结果,但任何指针都将不胜感激。

4

2 回答 2

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/');
?>
于 2013-01-23T12:58:29.953 回答
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();
}
于 2013-01-23T12:58:40.687 回答