Как создать и скачать zip-файл в ASP.NET Core? - PullRequest
0 голосов
/ 29 июня 2018

Нам нужно объединить несколько файлов в формате Zip и загрузить его. Не могли бы вы предложить способ сделать это в ядре ASP.NET без использования сторонних библиотек.

В ASP.NET MVC мы можем добиться этого, используя https://msdn.microsoft.com/en-us/library/system.io.packaging.aspx. Возможно ли это в ASP.NET core 2.0?

1 Ответ

0 голосов
/ 16 октября 2018

Я думаю, что это вам очень поможет

 protected FileStreamResult DownloadFolder(string path, string[] names, int count)
    {
        FileStreamResult fileStreamResult;
        var tempPath = Path.Combine(Path.GetTempPath(), "temp.zip");
        if (names.Length == 1)
        {
            path = path.Remove(path.Length - 1);
            ZipFile.CreateFromDirectory(path, tempPath, CompressionLevel.Fastest, true);
            FileStream fileStreamInput = new FileStream(tempPath, FileMode.Open, FileAccess.Read, FileShare.Delete);
            fileStreamResult = new FileStreamResult(fileStreamInput, "APPLICATION/octet-stream");
            fileStreamResult.FileDownloadName = names[0] + ".zip";
        }
        else
        {
            string extension;
            string currentDirectory;
            ZipArchiveEntry zipEntry;
            ZipArchive archive;
            if (count == 0)
            {
                string directory = Path.GetDirectoryName(path);
                string rootFolder = Path.GetDirectoryName(directory);
                using (archive = ZipFile.Open(tempPath, ZipArchiveMode.Update))
                {
                    for (var i = 0; i < names.Length; i++)
                    {
                        currentDirectory = Path.Combine(rootFolder, names[i]);
                        foreach (var filePath in Directory.GetFiles(currentDirectory, "*.*", SearchOption.AllDirectories))
                        {
                            zipEntry = archive.CreateEntryFromFile(this.contentRootPath + "\\" + filePath, names[i] + filePath.Substring(currentDirectory.Length), CompressionLevel.Fastest);
                        }
                    }
                }
            }
            else
            {
                string lastSelected = names[names.Length - 1];
                string selectedExtension = Path.GetExtension(lastSelected);
                if (selectedExtension == "")
                {
                    path = Path.GetDirectoryName(Path.GetDirectoryName(path));
                    path = path.Replace("\\", "/") + "/";

                }
                using (archive = ZipFile.Open(tempPath, ZipArchiveMode.Update))
                {
                    for (var i = 0; i < names.Length; i++)
                    {
                        extension = Path.GetExtension(names[i]);
                        currentDirectory = Path.Combine(path, names[i]);
                        if (extension == "")
                        {
                            foreach (var filePath in Directory.GetFiles(currentDirectory, "*.*", SearchOption.AllDirectories))
                            {
                                zipEntry = archive.CreateEntryFromFile(this.contentRootPath + "\\" + filePath, filePath.Substring(path.Length), CompressionLevel.Fastest);
                            }
                        }
                        else
                        {
                            zipEntry = archive.CreateEntryFromFile(this.contentRootPath + "\\" + currentDirectory, names[i], CompressionLevel.Fastest);
                        }
                    }
                }

            }
            FileStream fileStreamInput = new FileStream(tempPath, FileMode.Open, FileAccess.Read, FileShare.Delete);
            fileStreamResult = new FileStreamResult(fileStreamInput, "APPLICATION/octet-stream");
            fileStreamResult.FileDownloadName = "folders.zip";
        }
        if (File.Exists(tempPath))
        {
            File.Delete(tempPath);
        }

        return fileStreamResult;

    }
...