Не удается загрузить файл Excel с сервера с помощью веб-службы C# - PullRequest
0 голосов
/ 21 марта 2020

Я хочу загрузить файл Excel на компьютер Клиента. Я использую веб-сервис C#. Используя JQuery AJAX вызов, я звоню в веб-службу, а затем хочу загрузить файл Excel.

Но проблема заключается в том, что я запускаю веб-службу прямо в браузере, который загружается, но с 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) {

        }
    });

1 Ответ

0 голосов
/ 21 марта 2020

Возможно, запрос Ajax загружает файл, но браузер не интерпретирует его как загрузку файла (поскольку при вызовах ajax вы сами обрабатываете ответ)

Вот пример странице, решая вашу проблему old-school.

Обратите внимание на использование элемента <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>
...