【问题标题】:Can't download Excel file from server using Web Service C#无法使用 Web 服务 C# 从服务器下载 Excel 文件
【发布时间】:2020-07-02 07:57:55
【问题描述】:

我想在客户的机器上下载 Excel 文件。 我正在使用 Web 服务 C#。 使用 JQuery AJAX 调用我正在调用 Web 服务,然后我想下载 excel 文件。

但问题是当我直接在浏览器中运行 Web 服务时,它正在下载,但使用 AJAX 调用时它没有下载。

这是我的代码:

C#:

    [WebMethod]
    public void DownloadExcel(string fileName)
    {
        string filePath = "~/Report/" + fileName;

        Context.Response.Clear();
        Context.Response.Buffer = true;
        Context.Response.Charset = "";
        Context.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
        Context.Response.AddHeader("content-disposition", "attachment;filename=" + fileName + ";");
        Context.Response.TransmitFile(Server.MapPath(filePath));
        Context.Response.Flush();
        Context.Response.End();
    }

JS:

    var FileName = "Test.xlsx"

    $.ajax({
        type: "POST",
        data: { "fileName": FileName },
        url: "API/MyService.asmx/DownloadExcel",
        dataType: 'json',
        success: function (data) {
              $('#MessageModal').modal('show');
        },
        error: function (request, error) {

        }
    });

【问题讨论】:

    标签: c# ajax asp.net-web-api


    【解决方案1】:

    Ajax 请求可能正在下载文件,但浏览器并未将其解释为文件下载(因为使用 ajax 调用,您正在自己处理响应)

    这是一个示例页面,可以解决您的老问题。

    请注意在页面上使用<Form> 元素和id="excelDownloadForm"。它没有runat="Server" 属性。

    在 Asp.Net 之后,我们习惯于每页只有一个表单 (runat="Server")。但实际上,您的 HTML 页面中可以有多个表单,并且可以将不同的数据束发布到不同的端点。

    这里唯一的缺点是您无法处理成功的响应并在传输完成时显示模式。

    请让我知道您对这种方法的看法以及是否有帮助。

    (注意:经过全面测试和工作)

    <%@ Page Title="Home Page" Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
        <script src="jquery.js"></script>
    </head>
    <body>
        <form id="excelDownloadForm" action="API/MyService.asmx/DownloadExcel" method="post" target="_self" >
            <input type="hidden" name="fileName" id="fileName" />
        </form>
        <form id="form1" runat="server">
        <div>
            <script>
                var FileName = "test.xlsx"
                $("#fileName").val(FileName);
                $("#excelDownloadForm").submit();
            </script>
        </div>
        </form>
    </body>
    </html>
    

    【讨论】:

    • 非常感谢。它工作正常。但我想要提交时的回调函数。如果文件下载成功与否并以模态显示消息
    • 最终用户会看到下载的文档,我不知道为什么需要显示一个模态窗口,消息告诉用户什么?
    最近更新 更多