从 ASP.NET Core MVC 控制器返回文件时出现问题 - 文件未下载

问题描述 投票:0回答:1

我正在尝试构建一个“下载”按钮,用于在浏览器中启动文件下载。

这是我的控制器:

    [HttpGet("AdminTools/{batchId}/DownloadAnswers")]
    public async Task<FileResult> DownloadAnswers(int batchId)
    {
        string fileName = "test.txt";
        byte[] filebytes = Encoding.UTF8.GetBytes("Hello World!");

        return File(filebytes, MimeHelper.GetMimeMapping(fileName), fileName);
    }

它应该从数据库中获取数据,并创建一个 CSV 文件进行交付,但我已经精简了代码。

在视图中,我有一个使用淘汰赛来数据绑定单击的按钮

 <button class="btn btn-light" data-bind="click: () => $parent.downloadAnswers(line.BatchId)"><i class="fad fa-file-download fa-fw"></i> Download </button>

以及我的 viewModel 中的代码

 downloadAnswers(batchId: number) {
        Q($.ajax({

            url: `/Attestering/AdminTools/${batchId}/DownloadAnswers/`,
            type: 'GET'
        }));
    }

当我单击按钮时,我得到以下响应:

Request headers:
GET /Attestering/AdminTools/91/DownloadAnswers/ HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: da-DK,da;q=0.9,en-US;q=0.8,en;q=0.7
Cache-Control: no-cache
Connection: keep-alive
Cookie: .AspNetCore.Antiforgery.QdXrCqqGsrk=CfDJ8KXm89uE_DNAripaOM8IAxzND7VK_PQPxpfmXtgTsKY1uN3acIgiucBdlkKaXs_eJvQu2Te066RjYnOlazo2P1oKclowja9hkxKhzrwIzq8GHhmsAhA_ZLQbMoFg59FeSEfExF04U6KJYk0W-Whhb1A
Host: localhost:7777
Pragma: no-cache
Referer: https://localhost:7777/attestering/admintools
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36
X-Requested-With: XMLHttpRequest
sec-ch-ua: "Chromium";v="110", "Not A(Brand";v="24", "Google Chrome";v="110"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"

这个响应头:

HTTP/1.1 200 OK
Content-Length: 12
Content-Type: text/plain
Date: Tue, 07 Mar 2023 13:34:44 GMT
Server: Kestrel
Content-Disposition: attachment; filename=test.txt; filename*=UTF-8''test.txt

还有这个回复

Hello World!

但是我没有下载文件。

我一直在寻找并尝试许多不同的事情。主要在控制器端。

有什么提示吗?

c# download asp.net-core-mvc httpresponse
1个回答
0
投票

您的控制器端没问题,如果您可以使用

MimeHelper.GetMimeMapping(fileName)
获得正确的内容类型,那么您失败只是因为您尝试使用ajax调用,您将在ajax响应中获得文件的内容(例如作为字符串)调用而不是文件

我尝试了两种解决方案,希望能有所帮助:

<input type="button" onclick="downloadtxt()" value="DownloadTxt"/>

<input type="button" onclick="downloadcsv()" value="DownloadCSV"/>



<script>
    function downloadtxt(){
        window.open("/Home/DownloadTxt")        
    }

    function downloadcsv(){
       var eleForm = $("<form method='get'></form>");
       eleForm.attr("action","/Home/DownloadCsv");
       $(document.body).append(eleForm);
       eleForm.submit();
    }
</script>

控制器:

[HttpGet]
        public async Task<FileResult> DownloadTxT( )
        {
            string fileName = "test.txt";
            byte[] filebytes = Encoding.UTF8.GetBytes("Hello World!");

            return File(filebytes, "text/plain", fileName);
        }

        [HttpGet]
        public async Task<FileResult> DownloadCSV()
        {
            string fileName = "test.csv";
            byte[] filebytes = Encoding.UTF8.GetBytes("Hello World!");

            return File(filebytes, "text/csv", fileName);
        }

结果:

© www.soinside.com 2019 - 2024. All rights reserved.