【问题标题】:MVC FilePathResult not downloading fileMVC FilePathResult 未下载文件
【发布时间】:2019-01-08 17:01:58
【问题描述】:

FilePathResult 没有下载文件

我尝试返回 File(...),尝试将文件更改为空白工作簿,更改了文件的位置

public ActionResult GenerateSupplyInformation(List<string> serialNumbers)
        {            
                if (serialNumbers != null)
                {
                    ViewBag.strmsg = "";
                    foreach (var serialNumber in serialNumbers)
                    {
                        if (!string.IsNullOrWhiteSpace(serialNumber))
                        {
                            var results = _ftRepository.GetSupplyInformation(serialNumber);

                            var filePath = _documentGenerator.GenerateSupplyInformation(serialNumber, results);

                            return new FilePathResult(filePath, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
                        }
                    }
                }

            }

            return null;
        }

我希望当这个方法被点击时文件会下载,因为没有抛出异常


这是问题的更新版本

这里是去掉了下载文件调用的 ajax 调用

$.ajax(
            {
                type: "POST",
                //url: "/JQueryAjaxCall/AjaxPostCall",
                url: "/RWM/GenerateSupplyInformation",
                data: JSON.stringify(models),
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (response) {
                    //alert("response");
                }
            }
        );

这里是 new(er) 可能略有不同,虽然它的行为相同,控制器方法

public ActionResult GenerateSupplyInformation(List<LxStockDataModel> records)
    {
        try
        {
            if (records != null)
            {
                ViewBag.strmsg = "";
                foreach (var serialNumber in records)
                {
                    if (!string.IsNullOrWhiteSpace(serialNumber.Serial_No))
                    {
                        var results = _ftRepository.GetSupplyInformation(serialNumber.Serial_No);

                        var filePath = _documentGenerator.GenerateSupplyInformation(serialNumber.Serial_No, results);

                        var file =  new FilePathResult(filePath, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
                        //return file;
                        return File(filePath, System.Net.Mime.MediaTypeNames.Application.Octet);
                    }
                }
                return View("RWMSummary", records);
            }
        }
        catch (Exception ex)
        {
            _log.Exception(ex);
        }
        return null;
    }

无论是方法中的返回,File 还是 FilePathResult,我都会得到文件不会下载的相同行为。我一定是做错了什么??

【问题讨论】:

    标签: c# asp.net-mvc download


    【解决方案1】:

    使用 FileResult 插入操作结果

    public FileResult GenerateSupplyInformation(List<string> serialNumbers)
        {            
                if (serialNumbers != null)
                {
                    ViewBag.strmsg = "";
                    foreach (var serialNumber in serialNumbers)
                    {
                        if (!string.IsNullOrWhiteSpace(serialNumber))
                        {
                            var results = _ftRepository.GetSupplyInformation(serialNumber);
    
                            var filePath = _documentGenerator.GenerateSupplyInformation(serialNumber, results);
    
                            return new FilePathResult(filePath, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
                        }
                    }
                }
    
            }
    
            return null;
        }
    

    【讨论】:

    • 这似乎没有什么不同。该文件已创建,因为我可以在我指定的目录中看到它。但是,该文件应该下载到他的浏览器中,而不是
    【解决方案2】:

    您是否尝试过使用“文件”方法?像这样:

    public ActionResult GenerateSupplyInformation(List<string> serialNumbers)
        {            
                if (serialNumbers != null)
                {
                    ViewBag.strmsg = "";
                    foreach (var serialNumber in serialNumbers)
                    {
                        if (!string.IsNullOrWhiteSpace(serialNumber))
                        {
                            var results = _ftRepository.GetSupplyInformation(serialNumber);
    
                            var filePath = _documentGenerator.GenerateSupplyInformation(serialNumber, results);
    
                            return File(filePath, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "YourDownloadedFileName.xls");
                        }
                    }
                }
    
            }
    
            return null;
        }
    

    它希望“filePath”是文件的完整路径(带有名称和扩展名)

    希望对你有帮助!

    【讨论】:

    • 是的,我也试过了。即使 filePath 只是不同目录上工作簿的字符串,它也会执行相同的操作,即不下载 var filePath = @"c:\\ws\\Book1.xlsx"; return File(filePath, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", Path.GetFileName(filePath));
    • 您的应用程序是否可能无法访问该路径/文件?您可以尝试下载应用程序文件夹中的文件(如“内容”中的图像)吗?
    • 我有一种感觉,可能是按钮上的 ajax 调用来击中无法处理响应的控制器方法。 $.ajax( { type: "POST", url: "/RWM/GenerateSupplyInformation", data: JSON.stringify(models), contentType: "application/json; charset=utf-8", dataType: "json", 成功: function (response) { window.location.href = '/RWM/DownloadFile?file=' + response; } } );
    • 是的,它是 AJAX 部分。如果我没记错的话,您正在尝试使用 GenerateSupplyInformation 返回的流文件重定向到您的“/RWM/DownloadFile”网址,这将不起作用。你可能会发现那里有更好的解释:stackoverflow.com/a/30704519/6488079
    • 好的,我已经有一段时间没有看到这个了,我很抱歉。我已经删除了对下载文件的 ajax 调用中的响应操作,但是它仍然没有下载生成的文件。
    猜你喜欢
    • 2013-12-16
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2021-03-07
    相关资源
    最近更新 更多