文件下载后重定向

时间:2014-12-18 21:36:54

标签: php http-headers

我的问题是:

按下我页面上的链接将(通过引用的php文件)调用一个从我的webservice下载文件的函数。这意味着标题信息是在文件下载时发送的,这也意味着我无法调用php标头函数将BACK重定向到我初始页面,在那里我点击了开头的链接。我想回到该页面的原因是它将更新我最新下载文件的历史记录,但不会在下载文件之前更新。

克服这一障碍的最佳方法是什么?

我的功能启动下载:

public function downloadAuthorityRules($api_key,$id)
{

    $curl_post_data = array('id' => $id); 

    $headers = array('Content-type: application/json','Authorization: '.$api_key,);
    $fp = fopen (dirname(__FILE__) . '/localfile.tmp', 'w+');//This is the file where we save the    information
    $curl = curl_init(DOWNLOAD_AUTHORITYRULES);
    curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($curl_post_data));
    curl_setopt($curl, CURLOPT_USERPWD, $api_key);
    $file = curl_exec($curl);

    if ($file === false) 
    {
        $info = curl_getinfo($curl);
        curl_close($curl);
        die('error occured during curl exec. Additioanl info: ' . var_export($info));
    }

    curl_close($curl);

    header('Content-type: ' . 'application/octet-stream');
    header('Content-Disposition: ' . 'attachment; filename=myndighedsregler.pdf');
    echo $file;        
}

2 个答案:

答案 0 :(得分:1)

下载完成后,您无法从下载页面重定向。这是不可能的。

在开始提供文件之前,您需要在下载页中更新db表。然后显示下载历史记录的主页会在下次刷新时自然更新(假设您正确设置了无缓存标头)。

是的,我知道,你想强迫它更新。但你不能按照你的想法去做。

  

克服这一障碍的最佳方法是什么?

你可以从主页进行Ajax轮询,每隔几秒刷新一次DIV的内部。您需要确保在cache: false调用中设置$.ajax()(如果使用jQuery,我建议您为Ajax执行此操作)。否则,由于浏览器缓存Ajax结果,主页上的信息可能不会提取新数据。

答案 1 :(得分:0)

找到解决我的重定向问题的另一种方法,这可能对其他人有用:

我的网页目前使用AJAX将内容加载到我的DIV&#S; S中,因此我已经有一个名为loadPage的javascript函数。

我做的是实现一个名为delayedLoadPage的函数,它只使用setTimeout,如下所示

function delayedLoadPage(page)
{
    setTimeout(function() { loadPage(page);},5000);     
}

此函数将在5秒钟后调用loadPage。

我改变了我对下载所在的php的引用,并添加了一个onclick事件

<a onclick="javascript:delayedLoadPage('authorityRules.php')" href="<? echo "downloadAuthorityRules.php?id=".$auth_current['auth_rules'][0]['id'];?>" >

结果是,文件将开始下载,5秒后,当超时发生并调用loadPage时,我的页面会重新加载。