Asp.net 在.Net中从服务器传输压缩文件

Asp.net 在.Net中从服务器传输压缩文件,asp.net,response.transmitfile,Asp.net,Response.transmitfile,我正在编写一个小型web应用程序,其中一部分功能是能够将日志从服务器下载到用户的文件系统。我能够压缩现有的日志,但无法将压缩后的文件夹传输。我在这里浏览了许多其他类似的问题,但还没有根据其中任何一个问题使其发挥作用 以下是我目前正在尝试的代码: .Net控制器 [HttpPost] public ActionResult DownloadLogs() { string path = System.Configuration.ConfigurationManager.AppSettings

我正在编写一个小型web应用程序,其中一部分功能是能够将日志从服务器下载到用户的文件系统。我能够压缩现有的日志,但无法将压缩后的文件夹传输。我在这里浏览了许多其他类似的问题,但还没有根据其中任何一个问题使其发挥作用

以下是我目前正在尝试的代码:

.Net控制器

[HttpPost]
public ActionResult DownloadLogs()
{
    string path = System.Configuration.ConfigurationManager.AppSettings["LogPath"];

    try
    {

        Log.Information("Closing current logger. AudtiLog: {auditLog}", true);
        Log.CloseAndFlush();
        string startPath = path;
        string zipPath = "C:\\my_folder\\result.zip";
        string extractPath = path + "extract";

        //deleting existing zips
        if (System.IO.File.Exists(zipPath))
            System.IO.File.Delete(zipPath);
        if (System.IO.Directory.Exists(extractPath)) 
            System.IO.Directory.Delete(extractPath, true);

        ZipFile.CreateFromDirectory(startPath, zipPath);
        ZipFile.ExtractToDirectory(zipPath, extractPath);

        FileInfo file = new FileInfo(zipPath);

        using (FileStream filestream = new FileStream(zipPath, FileMode.Open))
        {
            return File(filestream, "application/zip", "ServerLogZip.zip");
        }

    }
    catch (Exception ex)
    {
        Log.Error("Error occurred when downloading server logs. Error: {Error}; AuditLog: {auditLog}", ex.Message, true);
        return Json(new { result = "error" });
    }

}
Javascript

function DownloadLogs() {

            $.ajax({
                type: "POST",
                url: "/ManageServer/DownloadLogs",
                contentType: "application/zip",
                success: function (response) {
                    alert("Success")
                },
                error: function (response) {
                    alert("Error");
                }
            });
        }
每当我运行它时,它都会将日志压缩到一个文件夹中,成功地完成代码的
响应部分,但什么也没发生。我已经试着调试并逐步完成代码,但还没有找到答案。我还尝试了
Response.WriteFile
方法。不走运

编辑
我已经更新了返回
ActionResult
的代码,并返回了
文件
。它当前正在从服务器返回一个500错误。

您的代码有问题,@mason注意到了。您正在尝试返回两个内容:文件和状态

应通过HTTP返回码检查操作状态

您可以使用
IActionResult
接口作为返回类型,以便正确处理问题。给方法一个
文件
作为返回类型,如果一切正常,它将返回包含所有所需标题的文件。如果出现问题,您可以返回
BadRequest(“错误消息”)

文件
返回类型接受包含原始数据、文件Mime类型和文件名的FileStream作为参数

要实现这一点,请执行以下步骤

  • 将方法返回类型更改为
    FileResult
  • 创建一个变量,该变量将以流的形式接收文件内容,或使用
    语句
  • 创建一个
    byte
    数组来分配文件内容(如果尝试返回filestream,则会出现file closed错误,因为在重新运行之前using语句已关闭)
  • 像这样返回数据
    返回文件(byteArray,“application/zip”,“ServerLogZip.zip”)
样品

try{
    // Do things to prepare your file

    using(FileStream filestream = new FileStream(zipPath,FileMode.Open))
    {
        byte[] zipBytes= new byte[filestream.Length];
        filestream.Read(PhotoBytes, 0, PhotoBytes.Length);
        return File(zipBytes, "application/zip", "ServerLogZip.zip"); 
    }
}
catch(Exception ex){
    return BadRequest("Something gone wrong: " + ex.Message);
}
我一直在绞尽脑汁想知道如何通过异步请求下载这个文件,但最后,我意识到也许你不需要这么复杂的解决方案。您只需调用路由即可下载文件

function DownloadLogs() {
    document.location = your_route;
}

为了正常工作,您还必须将C方法的方法装饰器从
[HttpPost]
更改为
[HttpGet]

您不应该在MVC操作方法中直接写入响应。您不能在单个操作方法中向响应写入文件并返回JSON。你只能做一个或另一个好的接球。我已经更新了代码,但是现在还不能用。谢谢你的回复。我一直在关注你的编辑。我将签名更改为ActionResult(因为它不喜欢
BadRequest'
)。当它从调用返回时,它指向ajax代码中的错误块。我应该补充一点,我将ajax调用中的内容类型更改为
application/zip
,它仍然返回一个500错误。在.net引发的异常中,消息的内容是什么?如果在ajax中执行
alert(response.data)
操作,您将收到错误消息,即
无法访问已关闭的文件。它正在返回ajax调用,而不是在控制器的try/catch中被捕获。我的愚蠢错误。。。该文件在返回之前已被释放。我已经用额外的步骤更新了答案