下载文件并通过 ajax 将其重定向到另一个页面

Posted

技术标签:

【中文标题】下载文件并通过 ajax 将其重定向到另一个页面【英文标题】:Download a file and redirect it to another page via ajax 【发布时间】:2017-01-01 13:32:11 【问题描述】:

我有一个用于下载 excel 文件的简单联系表。主要问题发生了,当 ajax 加载时。我想下载 excel 文件然后将用户重定向到下一页。下面是我的带有虚拟数据的代码。

Ajax 代码..

$.ajax(
    type: "POST",
    url: "/site/ajaxexcel.php", 
    data: 'value':'send',
    cache: false,
    success: function(html)
        location.href = '<?php echo base_url()."/site/welcome.php" ?>';                 
    
);

而我的ajaxexcel.php 代码是:

<?php 
$content= '<html xmlns:x="urn:schemas-microsoft-com:office:excel">
<head>
    <!--[if gte mso 9]>
    <xml>
        <x:ExcelWorkbook>
            <x:ExcelWorksheets>
                <x:ExcelWorksheet>
                    <x:Name>Sheet 1</x:Name>
                    <x:WorksheetOptions>
                        <x:Print>
                            <x:ValidPrinterInfo/>
                        </x:Print>
                    </x:WorksheetOptions>
                </x:ExcelWorksheet>
            </x:ExcelWorksheets>
        </x:ExcelWorkbook>
    </xml>
    <![endif]-->
</head>

<body><table class="table table-condensed table-striped table-hover table-bordered pull-left" id="myTable"><thead><tr><th>Rakesh</th><th>kumar</th></tr></thead><tbody><tr><th>Rakesh</th><th>Rakesh</th></tr><tr><th>Rakesh</th><th>Rakesh</th></tr><tr><th>Rakesh</th><th>Rakesh</th></tr><tr><th>Rakesh</th><th>Rakesh</th></tr></tbody></table></body></html>';
header('Content-type: application/excel');
header('Content-type: image/jpeg,image/gif,image/png');
header("Content-Disposition: attachment; filename=download.xls");
header("Pragma: ");
header("Cache-Control: ");
echo $content;
?>

我只想下载 excel 文件,然后将用户重定向到特定位置。

如果你做得正确,你也可以帮助我处理你的 codeigniter 代码..

【问题讨论】:

我认为这个链接***.com/questions/4545311/…会对你有所帮助 感谢您的评论。实际上,他们这样说,使用外部js文件。但是我的 ajax 代码很简单,也很简单。所以请在我的代码中帮助我。@user1048123_SOreadytohelp @KumarRakesh 你能把你的项目文件夹添加到我们可以下载的地方吗? Cz 我需要更多信息来帮助你 @KumarRakesh 有什么更新吗?? @Spartan .. 抱歉更新晚了.. 作为我的问题.. 我只有两个文件.. 我已经用另一种方式修复它.. 但这还不够我的答案.. 如果你可以做到 。请尝试使用我的代码.. 【参考方案1】:

试试下面的方法,希望能成功

    通过window.open在新窗口中打开ajaxexcel.php 它将开始下载,然后关闭它。 关闭后立即重定向页面。

【讨论】:

感谢@shaymmakwana.me 的回答 .. 但这对我来说还不够和正确的答案。就像您可以看到我的代码一样。它们已经用于下载文件的标头。所以不能在这个文件中使用 header:location code .. 我想你误解了,你需要在你打开ajaxexcel.php的父窗口(而不是ajaxexcel.php)中编写重定向代码。我建议尝试一次然后返回。 好的,让我再检查一次。非常感谢您的快速回复。 我以我的方式尝试您的代码。我认为,我无法完全管理它。请您为我编写代码。提前致谢【参考方案2】:

我认为下载起来非常困难。请使用 PHP Excel 创建文件并下载。

【讨论】:

哦耶..听起来不错..谢谢我已经尝试过了。但主要问题是重定向。下载代码后标题操作不起作用。 请在 PhpExcel 中使用这个 $name="file.xlsx"; $objWriter->save('文件夹名/'.$name); $path="文件夹名/file.xlsx"; header("位置:$path"); 我明白你的意思。它对我来说不能正常工作..而且我想用 ajax @vijju Pundir 来完成它 我不同意这一点,使用 php excel 我们可以创建和下载文件,过程非常简单。【参考方案3】:

您无法使用 Ajax 请求下载文件。您必须如何重定向到允许您下载文件的特定位置。您可能会尝试这样做,但尝试在单独的选项卡中下载文件并将您的页面重定向到特定页面。

<input id="btnGetResponse" type="button" value="Redirect" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script type="text/javascript">
$(function () 
    $("#btnGetResponse").click(function () 
        window.open('/test/excel.php');
        window.location = "http://***.com/";
    );
);
</script>

也从您的 PHP 文件 (excel.php) 中删除此行。否则,它会将您的文件下载为 JPG 或 PNG

header('Content-type: image/jpeg,image/gif,image/png');

【讨论】:

我无法得到答案。它给了我一种解决方案。根据我的要求,它对我来说并不完美【参考方案4】:

通过使用https://github.com/johnculviner/jquery.fileDownloadjs:

$.ajax(
    type: "POST",
    url: "/site/ajaxexcel.php", 
    data: 'value':'send',
    cache: false,
    success: function(html)
        
            $.fileDownload("ajaxheader.php",
            
                successCallback: function (url) 
                    location.href = '<?php echo base_url()."/site/welcome.php" ?>';    
                ,
                failCallback: function (responseHtml, url) 
                    alert('error');
                
            );       
        
);

并在 php 端在标题中添加以下行:

header("Set-Cookie: fileDownload=true; path=/");

【讨论】:

非常感谢您的回答.. 我得到了您的回答.. 在这种情况下,我的文件没有下载,只有位置 href 工作【参考方案5】:

您可以为此使用jquery.fileDownload.js。 你可以在这里找到一个例子。 . . http://www.codeasearch.com/working-with-jquery-filedownload-js-plugin.html

【讨论】:

没有完整的描述。我已经使用了他们的代码但没有得到具体的结果。请给我一个写的代码。而且我还想将用户重定向到另一个页面@Ravikiran kalal。【参考方案6】:

实际上,对于这种情况,我建议使用空白选项打开文件位置并重定向。为此,您需要创建一个表单结构并将其提交到您的 action.php

例子:

var form = document.createElement("form");
form.setAttribute("method", "post");
form.setAttribute("action", "action.php");
form.setAttribute("target", "myView");
// or you can use _blank : form.setAttribute("target", "_blank");

var hiddenField = document.createElement("input"); 
hiddenField.setAttribute("type", "hidden");
hiddenField.setAttribute("name", "message");
hiddenField.setAttribute("value", "val");
form.appendChild(hiddenField);
document.body.appendChild(form);
window.open('', 'myView');
form.submit();
alert("Redirect in 10 second!");
setTimeout(function()
  location.href = "/home"
, 10000);

【讨论】:

setTimeout 不是完美的方式。我认为,10 秒,或多或少都不是正确的方式,亲爱的。【参考方案7】:

通过使用https://github.com/johnculviner/jquery.fileDownload

也从您的 PHP 文件 (excel.php) 中删除此行。否则,它会将您的文件下载为 JPG 或 PNG

header('内容类型:image/jpeg,image/gif,image/png');

【讨论】:

就像 Ish 回答一样。你能帮我写下你的完整代码吗?【参考方案8】:

您可以通过创建虚拟表单并发布它来实现这一点。

function autoGenerateAndSubmitForm(method, url, post_data) 
    var element = document.getElementById("virtual_form");
    if(element != null )
    
        element.parentNode.removeChild(element);
    
    var form = document.createElement("form");
    form.setAttribute("id", "virtual_form");
    form.setAttribute("style", "display:none;");
    form.setAttribute("target", "_blank"); // This line is very important in your case for redirect in other page and download your file.
    form.method = method;
    form.action = url;   
    for(i in post_data)
    
         var element=document.createElement("input");
         element.value=post_data[i];
         element.name=i;
         form.appendChild(element); 
    
    document.body.appendChild(form);
    form.submit();
    form.parentNode.removeChild(form);

在你需要的地方调用上面的方法,我假设你已经在点击事件中调用它

$('button').on('click', function(e)
     autoGenerateAndSubmitForm("POST","/site/ajaxexcel.php",'value':'send');
     location.href = '<?php echo base_url()."/site/welcome.php" ?>';     
);

从您的服务器端代码中删除以下行。

header('Content-type: image/jpeg,image/gif,image/png');

【讨论】:

感谢您的回复。我已经使用了您的代码但是在控制台中发生了很多错误,例如阻止网址等。 这对我有用……奇怪的是不适合你……而且会阻止 url?你在使用 SSL 证书吗?【参考方案9】:

在 Ajax 中....您可以在服务器上创建一个 excel 文件...ajax 响应将是 excel 文件的路径...在 ajax 成功时在新选项卡中打开 excel 文件(它会自动下载 excel)同时打开带有新位置的新标签。

下面给出的ajax成功示例代码

  window.open("path to excel..");
    window.open("new location");

也可以使用(如果需要)

window.location.replace("new location");

Open multiple links in Chrome at once as new tabs

【讨论】:

【参考方案10】:

方法一:使用jQuery AJAX

用下面的代码替换你的ajax..

<script>
$.ajax(
    type: "POST",
    url: "/site/ajaxexcel.php", 
    data: 'value':'send',
    cache: false,
    success: function(html)
    
        window.open("/site/ajaxexcel.php");
        location.href = '<?php echo base_url()."/site/welcome.php" ?>';                 
    
);
</script>   

window.open 将在单独的窗口中打开 ajaxexcel.php 文件,location.href 将重定向到给定的welcome.php 文件。这是最好的方法。

方法2:使用jQuery文件下载插件

只包括 jqueryfiledownload script 并执行以下操作:

<a class="download" href="/path/to/file">Download</a>
<script>
$(document).on("click", "a.download", function () 
            $.fileDownload($(this).prop('href'))
                .done(function ()  alert('File download a success!'); //success code)
                .fail(function ()  alert('File download failed!');//failure code );

            return false; //this is critical to stop the click event which will trigger a normal file download
        );
</script>

现在,当您单击锚点时,您的文件将被下载,您可以分别在 done()/fail() 函数中编写成功/失败代码。

【讨论】:

就像Milan malani answer一样,我已经尝试过这种代码。但主要问题是文件下载在新窗口中打开 hii @KumarRakesh ,我同意文件下载将在新窗口中打开,但新窗口将自动关闭并立即出现下载对话框,您将重定向到另一个页面.. 还有一件事,亲爱的,它在 Chrome 和 Safari 中不起作用。【参考方案11】:

只需使用简单的 javascript

window.location.replace(###file url###);

【讨论】:

【参考方案12】:

1) Ajax 不是解决方案。

2) window.open() 弹出窗口将在大多数浏览器中被阻止,即使来自同一域(至少前段时间在 chrome 和 FF 中发生这种情况,当时我试图实现类似的东西)

这样的事情可以完成这项工作:(它不会检查返回的代码之类的东西,所以404 或非文件输出将导致重定向而不下载)

document.getElementById('zzz').onclick = function() 
  ifrm = document.createElement('iframe');
  ifrm.style.display = "none";

  ifrm.src = "https://github.com/SheetJS/test_files/blob/b07031a7bd5a8b86b9baac94267f20cf81c6d5eb/A4X_2013.xls?raw=true"; 
// some random xls file from github (it contains just a single "x" character in cell A-4)
  
  ifrm.onload = function() 
    window.location.href = "https://jquery.com";
  ;
  
  document.body.appendChild(ifrm);
  return false;
<a href="#" id="zzz">
click me
</a>

P.S.:对于某些文件类型(如 pdf),您需要 application/octet-stream Content-type 标头来强制浏览器下载文件而不是使用内置查看器。

【讨论】:

以上是关于下载文件并通过 ajax 将其重定向到另一个页面的主要内容,如果未能解决你的问题,请参考以下文章

在用户填写提交表单后将其重定向到他们的提交

仅输入域名时如何将其重定向到特定页面?

提交ajax表单并使用jquery重定向到另一个页面

从进度输出中删除进度条,将其重定向到日志文件中

Pharo Smalltalk - 消息转发,是不是可以截获消息并将其重定向到另一个对象(实例)?

如何将从 Ajax 请求收到的响应重定向到另一个 html 页面