【问题标题】:ASP.NET MVC file downloading as plain textASP.NET MVC 文件以纯文本格式下载
【发布时间】: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


【解决方案1】:

为了防止导航器显示文件使用application/octet-stream

return File(Encoding.UTF8.GetBytes(output), "application/octet-stream", "CKRM_" + Code+ "_" + Name+ ".txt");

并通过 ajax 下载文件:

$.ajax({
        url: '/Portal/generateCKRM',
        data: {
            'Code': $('#txtCode').val(), 'Name': $('#txtName').val()
        },
        type: 'GET',
        contentType: "application/json; charset=utf-8",
        datatype: 'json',
        success: function (data) {
            var a = document.createElement('a');
            var url = window.URL.createObjectURL(data);
            a.href = url;
            a.download = 'file.txt';
            a.click();
            window.URL.revokeObjectURL(url);

            $('body').loader('hide');
        },
        error: function () { alert('Server Error! Please try again later.'); $('body').loader('hide'); }
    });

【讨论】:

  • 谢谢你 Mustapha,它给了我一个想法。
  • 为什么需要所有这些代码并创建虚假的超链接对象,而包含 URL 的简单 window.open 命令可以完成同样的工作?