C# ASP.NET核心Web API-使用IFormFile从上载控制器获取和提取.zip文件

C# ASP.NET核心Web API-使用IFormFile从上载控制器获取和提取.zip文件,c#,asp.net-core,upload,unzip,iformfile,C#,Asp.net Core,Upload,Unzip,Iformfile,我有一个API上传控制器,它有一个参数文件。在Swagger中,我传递了一个.zip文件,其中包含一些.json文件。我想从我从Swagger收到的.zip文件中获取这些.json文件,并将它们传递给将处理它们的服务 所以我创造了这样的逻辑。我将.zip文件保存在(~Temp>settings)目录中,接下来要做的是解压缩该文件并将.json文件发送到另一个名为“Temp json imports”的目录中。这样我就可以得到.json文件并使用它们 这是我到目前为止编写的代码,它不起作用,最后

我有一个API上传控制器,它有一个参数文件。在Swagger中,我传递了一个.zip文件,其中包含一些.json文件。我想从我从Swagger收到的.zip文件中获取这些.json文件,并将它们传递给将处理它们的服务

所以我创造了这样的逻辑。我将.zip文件保存在(~Temp>settings)目录中,接下来要做的是解压缩该文件并将.json文件发送到另一个名为“Temp json imports”的目录中。这样我就可以得到.json文件并使用它们

这是我到目前为止编写的代码,它不起作用,最后一行失败-(ZipFile.extractodirectory(filePath,tmpJsonImports);),类型为System.IO.IOException的异常(如下图所示)。 任何关于如何解决这个问题的想法都是非常受欢迎的。:)

[HttpPost(“导入/{applicationId}”)]
公共异步任务导入设置([FromRoute]Guid applicationId,IFormFile)
{
字符串tempPath=Path.Combine(_hostingEnvironment.ContentRootPath,Path.GetTempPath());
字符串tmpSettingsPath=Path.Combine(tempPath,“设置”);
字符串tmpImportSettings=Path.Combine(tmpsettingpath,“导入”);
字符串tmpJsonImports=Path.Combine(tmpImportSettings,“临时json导入”);
CreateDirectory(tmpSettingsPath);
CreateDirectory(tmpImportSettings);
CreateDirectory(tmpJsonImports);
long size=file.Length;
如果(大小>0)
{
var filePath=tmpImportSettings+“\\”+file.FileName;
使用var stream=newfilestream(filePath,FileMode.Create);
等待文件.CopyToAsync(流);
字符串zipPath=Path.GetFileName(filePath);
提取器目录(文件路径,tmpJsonImports);
}
返回Ok();
}

尝试在我的应用程序上使用您的代码,它将显示此异常:

此异常与以下代码有关,您在将文件复制到路径后未关闭文件句柄

    var filePath = tmpImportSettings + "\\" + file.FileName;

    using var stream = new FileStream(filePath, FileMode.Create);
    await file.CopyToAsync(stream);
要解决此异常,请尝试按以下方式修改代码:

            if (size > 0)
            {
                var filePath = tmpImportSettings + "\\" + fileviewmodel.File.FileName;

                using (var stream = new FileStream(filePath, FileMode.Create))
                {
                    await fileviewmodel.File.CopyToAsync(stream);
                };

                string zipPath = Path.GetFileName(filePath);
                ZipFile.ExtractToDirectory(filePath, tmpJsonImports);
            }

为什么需要将文件保存到磁盘?@milo我没有想出其他解决方案..嗨@AleksandarStefanovski,我可以知道回复是否解决了问题吗?如果没有,请尝试在ImportSettings方法中使用
try catch
语句并检查详细的异常消息,然后请在此处共享。然后,我们可以一起努力解决这个问题。
            if (size > 0)
            {
                var filePath = tmpImportSettings + "\\" + fileviewmodel.File.FileName;

                using (var stream = new FileStream(filePath, FileMode.Create))
                {
                    await fileviewmodel.File.CopyToAsync(stream);
                };

                string zipPath = Path.GetFileName(filePath);
                ZipFile.ExtractToDirectory(filePath, tmpJsonImports);
            }