从Ajax调用时,文件下载脚本不起作用

rob*_*ert 4 php ajax download

我正在使用以下脚本来启动文件下载:

if (file_exists($newfilename)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($newfilename));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($newfilename));
    ob_clean();
    flush();
    readfile($newfilename);
    exit;
}
Run Code Online (Sandbox Code Playgroud)

当我直接打开页面时,它工作正常,但问题是,我需要从另一个页面通过Ajax调用此脚本.当我这样做,然后下载没有开始.脚本的其余部分完成了它应该做的事情.

我认为问题是无法以这种方式使用头功能,但肯定有办法让这个工作吗?

如果它有任何帮助,这是Ajax函数:

<script type="text/javascript">
    // function create GetXmlHttpObject
    function GetXmlHttpObject()
    {
    if (window.XMLHttpRequest)
    {
    // code for IE7+, Firefox, Chrome, Opera, Safari
    return new XMLHttpRequest();
    }
    if (window.ActiveXObject)
    {
    // code for IE6, IE5
    return new ActiveXObject("Microsoft.XMLHTTP");
    }
    return null;
    }

    function submitVideoAjax(){
    var myAjaxPostrequest=new GetXmlHttpObject();

    var t2_title=document.video_form.title.value;

    var parameters="title="+t2_title;

    myAjaxPostrequest.open("POST", "newdownloadmanager.php", true);
    myAjaxPostrequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    myAjaxPostrequest.send(parameters);
    myAjaxPostrequest.onreadystatechange=function(){
    if(myAjaxPostrequest.readyState==4){
    if(myAjaxPostrequest.status==200){
    document.getElementById("result").innerHTML=myAjaxPostrequest.responseText;
    document.getElementById("video_form").style.display = "none";

    }
    else    {
    document.getElementById("video_form").innerHTML="An error has occured making the request";
    }
    }
    }
    }
    </script>
Run Code Online (Sandbox Code Playgroud)

这是形式:

<form name='video_form' id='video_form' method="post">
<input type="hidden" name="title" id="title" value="Madelyn2-01.mp4"/>
<button type="button" name="submit_video" id="submit_video" onclick="submitVideoAjax();">Download</button>
</form>
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 9

您无法使用AJAX下载文件.这没有意义.您可以发送AJAX请求并在客户端上的成功处理程序中获取文件内容,但出于明显的安全原因,您无法对其进行太多操作.您无法将其保存在客户端计算机上,并且没有javascript API允许您提示用户将其保存在何处.

所以要下载文件,不要使用AJAX.创建一个指向服务器端脚本的锚点,该脚本提供要下载的文件.

  • 如果我们只想允许经过身份验证的用户下载文件怎么办?那么问题是,如何从浏览器执行 GET 请求,并适当修改标头(以便可以在服务器端对事务进行身份验证),并且只有在身份验证成功后,服务器才会用文件进行响应。有什么建议么?我来自这里:http://stackoverflow.com/q/28056246/1355058 (2认同)