在 AJAX 处理程序中下载文件

Download File in AJAX Handler

我只使用 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 for creating Binary Object on client side. You create typed array like answered here.