分享
为什么问答平台  ›  专栏  ›  技术社区  ›  Nilesh

php文件下载:php以ajax响应发送文件数据,但文件未下载 - PHP file download: PHP is sending file data in ajax response but file is not downloading

  •  0
  • Nilesh  · 技术社区  · 5 天前

    我有一个 HTML 允许用户下载文件的页面有一个按钮可以下载该文件,我正在使用 onClick 要生成的事件 ajax 呼叫 php 提供文件数据的脚本。

    问题是响应中正在接收文件数据,但文件不是下载的。

    我已经提到过这个了 Php file download through ajax request 但不能解决我的问题

    HTML

    
    <button onClick="download()"> Download </button>
    
    <script>
        function download {
        var url = "download"; //it is a code ignitor project hence it is just an action call.
        var path ="<?php echo $data[0]->file_path . $data[0]->file_name; ?>";
        $.post(url, {path: path}, function(result){
    
        });
    </script>
    

    PHP script

    
    public function download() {
            $path = $this->input->post('path');
    
            if(!file_exists($path)){
                die('file not found');
            } else {
    
                header("Content-Disposition: attachment; filename=" . basename($path) . "");
                header("Content-Length: " . filesize($path));
                header("Content-Type: application/octet-stream;");
                readfile($path);
            }
        }
    
    

    谢谢。

    1 回复  |  直到 5 天前
        1
  •  1
  •   Barmar    5 天前

    更改服务器功能,使其使用 get 参数。然后用脚本URL打开一个新窗口。

    function download() {
        var path ="<?php echo $data[0]->file_path . $data[0]->file_name; ?>";
        var url = "download?path=" + encodeURIComponent(path); //it is a code ignitor project hence it is just an action call.
        window.open(url);
    });
    
    public function download() {
        $path = $this->input->get('path');
    
        if(!file_exists($path)){
            die('file not found');
        } else {
            header("Content-Disposition: attachment; filename=" . basename($path) . "");
            header("Content-Length: " . filesize($path));
            header("Content-Type: application/octet-stream;");
            readfile($path);
        }
    }