在AJAX处理程序中下载文件 - javascript

我只使用PHP编写了一个小脚本,以使用实验性API测试文件下载功能,在这种情况下效果很好。当我决定将此代码提交给我的项目时,我向AJAX调用的处理程序中添加了相同的代码,但是它没有像以前那样开始下载。

我相信这是由于我正在使用AJAX,但是由于我正在使用header()在客户端上启动文件下载,因此我无所适从。

谁能建议一种替代方法立即执行此操作?

AJAX:

    $.ajax({
        type: "POST",
        url: "handler.php",
        data: { 'action': 'downloadFile', 'filename': curSelectedFile },
        dataType: 'json',
        success: function(data)
        {
            //Success
        }
    });

PHP处理程序:

case "downloadFile":
{
    $filename = '';

    if (isset($_POST["filename"]))
    {
        $filename = $_POST["filename"];
    }

    $pos = 0; // Position in file to start reading from
    $len = 32; // Length of bytes to read each iteration
    $count = 0; // Counter for the number of bytes in the file

    do
    {
        $result = $fm->getFileChunk($filename, $pos, $len);
        $chunk = $result->result;

        if (!empty($chunk))
        {
            $chunk = base64_decode($chunk);
            $count += strlen($chunk);

            echo $chunk;
        }

        $pos += $len;
    }
    while (!empty($chunk));

    header('Content-Disposition: attachment; filename="'. $filename .'"');
    header('Content-Type: application/octet-stream');
    header('Content-Length: ' . $count);

    $response['status'] = "success";

    echo json_encode($response);

    break;
}

参考方案

您可以在base64中编码文件,并使用JavaScript创建文件对象。

对于大文件,我不建议这样做!

选择:

将文件保存在服务器上,就可以在Ajax回调中使用location.href检索文件位置并重定向。

您可以使用atob()解码base64并创建类型化数组。请参考以下link在客户端创建Binary Object。您创建像回答here这样的类型化数组。

如果我得到url(''),我该如何使用另一个URL - javascript

我是新手,正在写这篇文章,但是如果源上没有图像,那么我只有空白。有人可以告诉我,如果我正在获取背景图像,如何获取/images/no-image.jpg:url();这是我的代码:<div class="uk-clearfix uk-position-relative"> <div class="recipeb…

在JavaScript函数中转义引号 - javascript

我正在尝试将变量传递给javascript函数。根据用户的选择,它可以是文本或图像。这里已经讨论了类似的问题,但我无法解决。在php中,我这样编码:if ($choice == 1) { $img = '<img src = "../folder/'.$_SESSION["img"].'�…

如何在没有for循环的情况下在Javascript中使用Django模板标签 - javascript

我想在JavaScript中使用模板变量:我的问题是在javascript代码中使用for循环,for循环之间的所有事情都会重复..但我不想要....下面粘贴了我的代码..有人可以告诉我更好的方法吗这..因为这看起来很丑..这是我的代码: {% block extra_javascript %} <script src="/static/js…

使用JS和PHP更改弹出窗口背景图像 - javascript

我有一个JS函数:function zoom(now) { document.getElementById("popup").style.display = "block"; document.getElementById("photos").style.backgroundImage = …

打印二维阵列 - javascript

我正在尝试打印子元素。在this example之后。怎么做?。$myarray = array("DO"=>array('IDEAS','BRANDS','CREATIVE','CAMPAIGNS'), "JOCKEY"=>a…