【发布时间】:2025-12-07 22:50:02
【问题描述】:
我必须将一个简单的 txt 文件下载到客户端电脑,但在请求响应中只显示纯文本并且文件没有被下载。这是我的代码
public virtual FileContentResult generateCKRM(string Code,string Name)
{
DataTable dt = new DataTable();
CHOO.TOSSRepository.TOSSRepository tr = new CHOO.TOSSRepository.TOSSRepository();
dt = tr.GetDetails(Code, Name);
return File(Encoding.UTF8.GetBytes(output), "text/plain", "CKRM_" + Code+ "_" + Name+ ".txt");
}
return null;
}
我也尝试过没有结果的返回类型 ActionResult。 这是我的ajax调用,
function GenerateFile() {
$('body').loader('show');
$.ajax({
url: '/Portal/generateCKRM',
data: {
'Code': $('#txtCode').val(), 'Name': $('#txtName').val()
},
type: 'GET',
contentType: "application/json; charset=utf-8",
datatype: 'json',
success: function (data) {
// window.location = 'file=' + data;
$('body').loader('hide');
},
error: function () { alert('Server Error! Please try again later.'); $('body').loader('hide'); }
});
}
一切都很好,我可以在浏览器中看到响应,但没有下载文件。 Response Image
响应头值如下
Cache-Control: private
Content-Disposition: attachment; filename=CKRM_Arew_8712.txt
Content-Encoding: gzip
Content-Length: 1387
Content-Type: text/plain
Date: Mon, 23 Jul 2018 08:50:13 GMT
Server: Microsoft-IIS/10.0
Vary: Accept-Encoding
X-AspNet-Version: 4.0.30319
X-AspNetMvc-Version: 5.2
X-Powered-By: ASP.NET
更新: 我可以使用
在网络表单应用程序中下载文件 StringWriter oStringWriter = new StringWriter();
oStringWriter.WriteLine(output);
Response.AddHeader("content-disposition", "attachment;filename=" + "CKRM_"+code.Text+"_"+Name.Text+".edi");
Response.Clear();
using (StreamWriter writer = new StreamWriter(Response.OutputStream))
{
writer.Write(oStringWriter.ToString());
}
Response.End();
【问题讨论】:
-
"只显示纯文本,没有下载文件"...这是因为您的浏览器可以查看文本文件。图像文件或 HTML 文件或它可以显示的任何其他内容都是一样的。因此,从技术上讲,文件已下载(因为除非从服务器获取它,否则它无法显示在用户的机器上),它只是在一个临时位置并由浏览器显示。用户仍然可以使用 File -> Save As 保存它
-
此外,您尝试通过 ajax 执行此操作的事实也无济于事。无法通过 ajax 下载文件 - 数据只是在浏览器中的 JavaScript 变量中结束,而不是在用户的磁盘上。此外,从您的代码中也很难看出您将如何从 ajax 请求中看到任何文本,因为在您的“成功”回调中,您实际上并没有对响应做任何事情。您确定 ajax 确实在运行,而不是简单地进行回发或直接导航到此 URL?
-
@ADyson 感谢您的回复,我明白了您的意思,但这段代码也不适用于 .EDI 格式,我可以使用响应头在 Web 表单应用程序中下载相同的文件,请参阅我的更新的问题。当我在浏览器中获得响应时,ajax 也可以正常工作。我在成功回调中没有做任何事情,因为我只想让控制器下载文件,如果成功,我将在成功回调中向用户显示一条消息。
-
“也 ajax 工作正常,因为我在浏览器中得到响应”...是的,但正如我刚才提到的,AJAX 不能用于下载文件 到用户的磁盘我>。它总是会出现在脚本中的变量中。您需要向该 URL 发出常规 HTTP 请求才能启动正确的下载。
-
@ADyson 非常感谢你向我展示了正确的方法,我只是在我的成功回调中使用了一个 javascript 函数来将字符串下载为文件。
标签: jquery asp.net asp.net-mvc