1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/magicodes-Magicodes.IE

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
12.Exporting multiple formats in NETCore via request headers.md 9.7 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 03.03.2025 03:18 5e09f6d

Экспорт нескольких форматов в .NET Core с помощью заголовков запроса

Основные шаги

1. Установка пакета

Install-Package Magicodes.IE.AspNetCore

2. Настройка запуска

В методе Configure() файла Startup.cs после middleware UseRouting(), регистрируется следующее middleware:

public void Configure(IApplicationBuilder app)
{
    app.UseRouting();
    app.UseMagiCodesIE();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

Вышеуказанный подход предоставляет нам экспортировочные службы в виде middleware, поэтому давайте рассмотрим еще один способ:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers(options => options.Filters.Add(typeof(MagicodesFilter)));
}

Оба вышеописанных подхода предоставляют нам экспортировочные службы, мы просто должны конфигурировать контроллер с требуемыми возможностями. Характеристики в основном выполняют роль идентификации, а также содержат некоторые относящиеся данные, при этом идентификация может быть экспортирована как файл.

[HttpGet("excel")]
[Magicodes(Type = typeof(ExportTestDataWithAttrs))]
public List<ExportTestDataWithAttrs> Excel()
{
    return GenFu.GenFu.ListOf<ExportTestDataWithAttrs>(100);
}

В приведенном выше фрагменте кода мы идентифицируем, что данный класс допускается к экспорту. Также нам следует указать тип нашего экспортируемого класса через Type.

После того как это будет выполнено, мы можем передать вызов адресу, но обратите внимание, что нам необходимо добавить заголовок запроса для идентификации типа экспортируемого файла. Если мы не добавим заголовок запроса, то возвращенные данные будут все еще находиться в формате JSON. Название заголовка запроса — Magicodes-Type.

internal const string XLSXHttpContentMediaType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
internal const string PDFHttpContentMediaType = "application/pdf";
internal const string DOCXHttpContentMediaType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
internal const string HTMLHttpContentMediaType = "text/html";

Если говорить о шаблонном экспорте в формате Word или PDF, или даже HTML-файла, то мы делаем то же самое, как показано ниже.

[HttpGet("Word")]
[Magicodes(Type = typeof(ReceiptInfo), TemplatePath = ".//ExportTemplates//receipt.cshtml")]
public ReceiptInfo Word()
{
    return new ReceiptInfo
    {
        Amount = 22939.43m,
        Grade = "2019秋",
        IdNo = "43062619890622xxxx",
        Name = "张三",
        Payee = "湖南心莱信息科技有限公司",
        PaymentMethod = "微信支付",
        Profession = "运动训练",
        Remark = "学费",
        TradeStatus = "已完成",
        TradeTime = DateTime.Now,
        UppercaseAmount = "贰万贰仟玖佰叁拾玖圆肆角叁分",
        Code = "19071800001"
    };
}

[HttpGet("pdf")]
[Magicodes(Type = typeof(BatchPortraitReceiptInfoInput), TemplatePath = ".//ExportTemplates//batchReceipt.cshtml")]
public BatchPortraitReceiptInfoInput Pdf()
{
    var input = new BatchPortraitReceiptInfoInput
    {
        Payee = "湖南心莱信息科技有限公司",
        SealUrl = @"data:image/jpeg;base64....",
        LogoUrl = @"data:image/png;base64....",
        ReceiptInfoInputs = new List<BatchPortraitReceiptInfoDto>()
    };

    for (var i = 0; i < 500; i++)
        input.ReceiptInfoInputs.Add(new BatchPortraitReceiptInfoDto
        {
            Amount = 22939.43m,
            Grade = "2019秋",
            IdNo = "43062619890622xxxx",
            Name = "张三",
            PaymentMethod = "微信支付",
            Profession = "运动训练",
            Remark = "学费",
            TradeStatus = "已完成",
            TradeTime = DateTime.Now,
            UppercaseAmount = "贰万贰仟玖佰叁拾玖圆肆角叁分",
            Code = "1907180000" + i
        });

    return input;
}

[HttpGet("Html")]
[Magicodes(Type = typeof(ReceiptInfo), TemplatePath = ".//ExportTemplates//receipt.cshtml")]
public ReceiptInfo Html()
{
    return new ReceiptInfo
    {
        Amount = 22939.43m,
        Grade = "2019秋",
        IdNo = "43062619890622xxxx",
        Name = "张三",
        Payee = "湖南心莱信息科技有限公司",
        PaymentMethod = "微信支付",
        Profession = "运动训练",
        Remark = "学费",
        TradeStatus = "已完成",
        TradeTime = DateTime.Now,
        UppercaseAmount = "贰万贰仟玖佰叁拾玖圆肆角叁分",
        Code = "19071800001"
    };
}

Использование Swagger

Наследуя интерфейс IOperationFilter, создаем класс AddRequiredHeaderParameter, добавляем параметр заголовка типа, имя заголовка — Magicodes-Type, как показано ниже.

public class AddRequiredHeaderParameter : IOperationFilter
{
    public void Apply(OpenApiOperation operation, OperationFilterContext context)
    {
        if (operation.Parameters == null)
        {
            operation.Parameters = new List<OpenApiParameter>();
        }

        operation.Parameters.Add(new OpenApiParameter
        {
            Name = "Magicodes-Type",
            In = ParameterLocation.Header,
            Required = false,
            Description = "Согласно HttpContentMediaType добавьте значение заголовка, чтобы экспортировать файлы различных форматов."
        });
    }
}

Затем переходим к методу ConfigureServices() и добавляем следующее в метод AddSwaggerGen.

c.OperationFilter<AddRequiredHeaderParameter>();

Использование XMLHttpRequest

Используя XMLHttpRequest, почти так же, как при обычном экспорте, однако требуется обратить внимание на несколько мест:

  • Изменение responseType на blob.
  • Добавление заголовка HTTP.
  • Обработка двоичного потока данных.
document.querySelector("#downloadexcel").onclick = function () {
    var xmlhttp = new XMLHttpRequest();
    xmlhttp.open("GET", "https://localhost:5001/api/Magicodes/excel", true); // также можно использовать Post
    xmlhttp.responseType = 'blob';
    xmlhttp.setRequestHeader("Magicodes-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    xmlhttp.send();
    // readyState == 4 означает завершение запроса, status == 200 означает успешный ответ
    xmlhttp.onreadystatechange = function () {
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
            var name = xmlhttp.getResponseHeader("Content-disposition");
            var filename = name.substring(20, name.length);
            var blob = new Blob([xmlhttp.response], { type: 'text/xlsx' });
            var Url = URL.createObjectURL(blob);
            var link = document.createElement('a');
            link.href = Url;
            link.download = filename;
            link.click();
        }
    }
};

Использование jQuery AjaxДля использования jQuery Ajax требования аналогичны тем, что были указаны для XMLHttpRequest. Подробнее см. пример кода ниже, хотя текущий пример демонстрирует только экспорт в формате Excel. Для других форматов экспорта рекомендуется обратиться к ранее упомянутым константам Magicodes-Type. Конечно, для экспорта других файлов также требуется изменять responseType и тип Blob.

$("#downloadexcel").click(function() {
    $.ajax({
        url: "https://localhost:5001/api/Magicodes/excel",
        type: 'GET',
        headers: {
            'Magicodes-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
        },
        xhrFields: {
            responseType: 'blob'
        },
        success: function(data, status, xhr) {
            var name = xhr.getResponseHeader("Content-disposition");
            var filename = name.substring(20, name.length);
            var blob = new Blob([data], {
                type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
            });
            var Url = URL.createObjectURL(blob);
            var link = document.createElement('a');
            link.href = Url;
            link.download = filename;
            link.click();
        }
    });
});

Ссылки

https://github.com/dotnetcore/Magicodes.IE

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/magicodes-Magicodes.IE.git
git@api.gitlife.ru:oschina-mirror/magicodes-Magicodes.IE.git
oschina-mirror
magicodes-Magicodes.IE
magicodes-Magicodes.IE
master