php 正在使用 AJAX 在Laravel中下载文件?[duplicate]

xyhw6mcr  于 2022-10-30  发布在  PHP
关注(0)|答案(1)|浏览(141)

此问题在此处已有答案

Download a file by jQuery.Ajax(26个答案)
3天前关闭。
我需要在 AJAX 调用中下载CSV文件。
我可以在Laravel控制器中访问我 AJAX 请求。我也可以在我的ajax调用的成功函数中获得文件内容的响应。但是文件没有被下载。
laravel控制器代码:

public function export($request)
    {
        $details = $this->myService->getData($request);
        $csv_data = new Collection();
        if ($details->count() === 0) {
            return $csv_data;
        }

        foreach ($details as $detail) {
            $collection = collect([
                'id' => $detail->id,
            ]);
            $csv_data->push($collection);
        }
        $csv_file_name = abc.csv;

        $csv_headers = 'id'];
        $csv_column_names = [ 'id'];

        $callback = function () use ($csv_data, $csv_file_name, $csv_headers, $csv_column_names) {

            $stream = fopen('php://output', 'w');

            stream_filter_prepend($stream, 'convert.iconv.utf-8/cp932//TRANSLIT');

            $header = '"';
            $header .= implode('","', $csv_headers);
            $header .= '"';
            $header .= "\r\n";
            fwrite($stream, $header);

            foreach ($csv_data as $row) {
                $arr_data = [];
                foreach ($csv_column_names as $column_name) {
                    array_push($arr_data, $row->get($column_name));
                }
                $data = '"';
                $data .= implode('","', $arr_data);
                $data .= '"';
                $data .= "\r\n";
                fwrite($stream, $data);
            }
            fclose($stream);
        };

        $filename = $csv_file_name;

        $header = [
            'Content-Type' => 'application/octet-stream',
        ];

        return response()->streamDownload($callback, $filename, $header);

    }

我 AJAX 调用

$('#csv-file').on('click',function(e){
    e.preventDefault();

    let id = $("select[name='user_id']").val();

    $.ajax({
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        },
        url: "/user/csv",
        type:"POST",
        data:{
            id:id,
        },
        success:function(response){
            $( "#error" ).remove();
            console.log(response);
        },
        error: function(response) {
            $( "#error" ).remove();
            let errorView = 
                    `<div class="alert alert-error" id="error">
                        <h6>Error:</h6>
                        <ul class="flex flex-col items-start">
                            <li>`+ response.responseJSON.message + `</li>
                        </ul>
                    </div>`;
            $("#error-id").prepend(errorView);
        },
    });
});

在我 AJAX 调用的success函数中,我可以控制台日志并获取文件内容。但我需要下载未下载的文件。
先谢谢你。

ghhkc1vu

ghhkc1vu1#

将以下内容添加到 AJAX 参数中:

xhrFields: {
    responseType: "blob",
}

现在,在success函数中添加:

let a = document.createElement("a")
a.href = URL.createObjectURL(response)
a.download = response.filename
a.style.display = "none"
document.body.appendChild(a)
a.click()

这应该可以。

相关问题