文件未在 ajax post 上下载响应 .net 核心

file not downloading on ajax post response .net core

我遇到文件响应问题,它没有下载文件,请检查以下包含控制器方法和 Ajax post 调用的代码,

对象是在表单上输入一个来自用户的excel文件,根据条件读取和计算数据并据此得出结果,return文件中的字节数组响应给浏览器。

一切顺利,输入文件工作正常,数据读取工作正常,只是在响应中发出,它没有显示任何错误并且通过所有代码没有错误,文件没有下载。

[HttpPost]
        public async Task<ActionResult> UploadCallingDocument(UploadCallingViewModel model)
        {
            try
            {
                FormFileCollection files = Request.Form.Files as FormFileCollection;
                {
                    IFormFile file = files[0];
                    if (file != null && file.Length > 0)
                    {
                        var stream = file.OpenReadStream();
                            var result = await importExportFileManager.KeepAndShareFileAsync(stream);
                            return File(result, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "Summarized_KeepAndShare_File.xlsx");
                    }
                }
            }
            catch (Exception ex)
            {
                //to create error notification
            }
            return RedirectToAction("UploadCalling");
        }

 
$('form').submit(function (event) {
            event.preventDefault();
                var formdata = new FormData($(this).get(0));
                $.ajax({
                    url: this.action,
                    type: this.method,
                    data: formdata,
                    processData: false,
                    contentType: false,
                    beforeSend: function () {
                        // Doing some loading gif stuff
                        //displayBusyIndicator();
                    },
                    success: function (data) {
                        console.log('success');
                        //hideBusyIndicator();
                    },
                    complete: function () {
                        console.log('complete');
                        //hideBusyIndicator();
                    }
                });
           
            return false;
        });

执行UploadCallingDocument方法后,返回FileContentResult给Ajax成功函数,下载不成功,因为你没有操作成功。所以我添加了一个下载动作,使用 window.location 重定向到控制器中的 Download 动作。

下面的代码我使用序列化 'System.Byte[]' 类型的对象,所以我首先 安装 Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet 包。 然后在 ConfigureServices() 中添加对 AddNewtonsoftJson() 的调用。

services.AddControllersWithViews().AddNewtonsoftJson();

在您的控制器中,像下面这样更改您的代码:

        [HttpPost]
        public async Task<ActionResult> UploadCallingDocument(UploadCallingViewModel model)
        {
            try
            {
                FormFileCollection files = Request.Form.Files as FormFileCollection;
                {
                    IFormFile file = files[0];
                    if (file != null && file.Length > 0)
                    {
                        var stream = file.OpenReadStream();
                        TempData["file"]  = await importExportFileManager.KeepAndShareFileAsync(stream);
                        return Ok();
                    }

                            
                }
            }
            catch (Exception ex)
            {
                //to create error notification
            }
            return RedirectToAction("UploadCalling");
        }
       [HttpGet]
        public virtual ActionResult Download()
        {
            byte[] data = TempData["file"] as byte[];
            return File(data, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "Summarized_KeepAndShare_File.xlsx");
                    
        }

在您 ajax 成功后,更改您的代码如下:

success: function (data) {
                window.location = '/yourcontrollername/Download';
            }

结果: