Как загрузить файл, используя JS, являющийся файлом, являющимся результатом метода действия (.NET Core 2 MVC)

#jquery #.net #asp.net-core-2.0

#jquery #.net #asp.net-core-2.0

Вопрос:

У меня есть метод действия контроллера, который возвращает файл для загрузки. Мне нужно вызвать этот метод действия через Jquery, итак, как мне получить файл для загрузки?

Я знаю, как вызвать метод действия через Ajax-вызов или окно.расположение, но поскольку результатом метода действия является файл, как мне предоставить его пользователю для загрузки через jQuery?

Вот мой метод действия:

 public async Task<IActionResult> ExportClientes()
    {
        var model = new BasesDadosViewModel();

        model.Clientes = await _db.Clientes.ToListAsync();
        model.ClienteObj = new Clientes();

        DataTable dt = new DataTable();

        List<string> DontUse_Field = typeof(Clientes).GetProperties().Where(x => x.GetCustomAttributes(typeof(ObjAttributes), true).Any(ca => ((ObjAttributes)ca).DontUse)).Select(x => x.Name).ToList();

        var cliente_fields = model.ClienteObj.GetType().GetProperties();

        //formatar colunas da datatable
        foreach (var field in cliente_fields)
        {
            DataColumn col = dt.Columns.Add(field.Name, field.PropertyType);
        }

        foreach (var cliente in model.Clientes)
        {
            DataRow export_row = dt.NewRow();

            //Preenche dados
            int c = 0;
            foreach (var field in cliente_fields)
            {
                if (!DontUse_Field.Contains(field.Name))
                {
                    export_row[c] = field.GetValue(cliente);
                    c  ;
                }

            }

            dt.Rows.Add(export_row);
        }

        ExcelPackage excel = new ExcelPackage();
        var workSheet = excel.Workbook.Worksheets.Add("Clientes_Export");

        for (int i = 1; i < dt.Columns.Count; i  )
        {
            workSheet.Cells[1, i].Value = dt.Columns[i - 1];
        }

        int index = 2;
        foreach (DataRow row in dt.Rows)
        {
            for (int i = 1; i < dt.Columns.Count; i  )
            {
                workSheet.Cells[index, i].Value = row[i - 1];
            }

            index  ;
        }

        //Autofit columns
        for (int i = 1; i < dt.Columns.Count; i  )
        {
            workSheet.Column(i).AutoFit();
        }

        var filename = "Clientes_Export.xlsx";
        //var path = Path.Combine(_appEnvironment.WebRootPath, @"exports", filename);
        using (var fileStream = new FileStream(filename, FileMode.Create))
        {
            excel.SaveAs(fileStream);
        }


        var memory = new MemoryStream();
        using (var stream = new FileStream(filename, FileMode.Open))
        {
            stream.CopyTo(memory);
        }

        memory.Position = 0;
        ContentTypes contentType = new ContentTypes();
        return File(memory, contentType.GetContentType(filename), filename);

    }
  

Спасибо

Ответ №1:

 $.ajax({
    url: '/url/for/file',
    method: 'GET',
    xhrFields:{
        responseType: 'blob'
    },
    success: function (data) {
        let a = document.createElement('a');
        a.href = window.URL.createObjectURL(data);
        a.download = 'filename.ext';
        document.body.append(a);
        a.click();
        window.URL.revokeObjectURL(url);
});
  

Подводя итог, вам нужно использовать $.ajax вызов (вместо чего-то подобного $.get ), чтобы вы могли передавать параметры. Один из этих параметров должен быть, xhrFields чтобы вы могли указать тип ответа blob . Затем внутри вашей функции success вы будете динамически создавать новый a элемент, присваивать download атрибуту имя файла расширение, под которым вы хотите загрузить файл, присваивать href атрибуту URL-адрес объекта (составленный из данных blob-объекта), а затем добавлять этот элемент к вашему телу. После этого достаточно просто запустить событие click для этого динамически созданного элемента.

Комментарии:

1. Привет, Крис, прежде всего, большое тебе спасибо за помощь. Однако ваше предложение не работает. может быть, из-за моего метода действия? Я обновил свой вопрос с помощью метода действия. Спасибо