我正在尝试构建一个“下载”按钮,用于在浏览器中启动文件下载。
这是我的控制器:
[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!
但是我没有下载文件。
我一直在寻找并尝试许多不同的事情。主要在控制器端。
有什么提示吗?
您的控制器端没问题,如果您可以使用
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);
}
结果: