TheBigBearNow Ответов: 2

C# MVC create zip put files in it(готово) теперь распакуйте и откройте файлы


Привет всем, у меня сейчас есть он, поэтому моя программа создает zip-файл с отчетами в zip-файле. Мое действие контроллера возвращает файл, который является zip-файлом. У меня это происходит в успехе моего "Аякса".
Теперь, как я мог бы на следующем шаге, возможно, в успехе или я даже не уверен, где я должен иметь его, чтобы я мог вызвать другой метод для распаковки файлов. Затем откройте файлы, которые были распакованы?

Что бы вы все сделали?
Вот что у меня сейчас есть
$('#btnGetChecks').on('click', function () {
            var arrChkBoxes = [];
            var arrSelectedQIDs = [];
            //$('input:checked').each(function() {
            //});    with 0 -  ^(0|\+?[1-9]\d*)$         /^-?[0-9]+$/
            // $(this).val($(this).val().replace(/[^\d].+/, ""));
            // if (!(keyCode >= 48 && keyCode <= 57)
           
            // Turn all selected checkbox T/F values into QuoteIDs
            $("input:checked").each(function (index, value) {
                arrChkBoxes.push($(value).val());
            });
            // Push all QuoteIDs into new array
            $.each(arrChkBoxes, function (key, value) {
                if (IsPositiveInteger(value)) {
                    arrSelectedQIDs.push(value);
                }
            }); 

            $.ajax({
                type: "GET",
                url: "/Service/ExportFiles/",
                contentType: "application/json; charset=utf-8",
                traditional: true,
                data: { "quoteIDs": arrSelectedQIDs },
                success: function (data) {
                    window.location = '/Service/DownloadAsZip?mimeType=' + data;
                    //window.location = '/Service/UnZipDownload';
                },
                error: function (request, status, error) {
                    alert("Error Generating Files");
                        //+ request.responseText);
                }
            });
        });
[HttpGet]
        public void UnZipDownload()
        {
            if(TempData["ZipName"] != null)
            {
                string zipName = TempData["ZipName"] as string;
                string downloadPath = new KnownFolder(KnownFolderType.Downloads).Path;
                string filePath = new KnownFolder(KnownFolderType.Downloads).Path;
                downloadPath = Path.GetFullPath(downloadPath);
                //Make sure last char on path doesn't allow malicious code outside of it.
                if (!downloadPath.EndsWith(Path.DirectorySeparatorChar.ToString(), StringComparison.Ordinal))
                    downloadPath += Path.DirectorySeparatorChar;

                using (ZipArchive archive = ZipFile.OpenRead(filePath + zipName))
                {
                    foreach(ZipArchiveEntry entry in archive.Entries)
                    {
                        if(entry.FullName.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
                        {
                            entry.ExtractToFile(filePath);
                        }
                    }
                }
            }
           
        }

        /* Uses System.IO.Compression Library */
        [HttpGet]
        public virtual ActionResult DownloadAsZip(string mimeType)
        {          
            if (TempData["Files"] != null)
            {
                List<ServiceFile> lstFiles = TempData["Files"] as List<ServiceFile>;
                byte[] bytearray = null;
                string timeNow = DateTime.Now.ToString("MM-dd-yyyy-HHmmss");
                string fileName = "Service" + timeNow + ".zip";

                using (MemoryStream ms = new MemoryStream())
                {
                    // Creates the .zip
                    using (ZipArchive archive = new ZipArchive(ms, ZipArchiveMode.Create, true))
                    {
                        foreach (ServiceFile file in lstFiles)  // iterate through each file
                        {
                            // Creates empty file and names it inside of .zip
                            ZipArchiveEntry zipItem = archive.CreateEntry(file.FileName + file.Extension);
                            // adds file to zipItem
                            using (MemoryStream ms4file = new MemoryStream(file.FileBytes))
                            {
                                using (Stream stream = zipItem.Open())
                                {
                                    ms4file.CopyTo(stream);
                                }
                            }
                        }
                    }
                    bytearray = ms.ToArray();
                }
                TempData["ZipName"] = fileName;
                return File(bytearray, "application/zip", fileName);
            }
            else
            {
                return new EmptyResult();
            }
        }


Что я уже пробовал:

Я попытался сделать это в своем успехе под линией, которая была создана, но она перешла к новому методу, но тогда мой zip не был создан.

2 Ответов

Рейтинг:
7

TheBigBearNow

Это метод, который я создал, который берет zip-файл, распаковывает его и помещает все PDF-файлы, которые были в zip-файле, в каталог загрузок.
Теперь моим последним шагом будет создание метода, который открывает каждый PDF-файл.

[HttpGet]
        public void UnZipDownload()
        {
            if(TempData["ZipName"] != null)
            {
                string zipName = TempData["ZipName"] as string;
                string downloadPath = new KnownFolder(KnownFolderType.Downloads).Path;
                string filePath = new KnownFolder(KnownFolderType.Downloads).Path;
                downloadPath = Path.GetFullPath(downloadPath);
                //Make sure last char on path doesn't allow malicious code outside of it.
                if (!downloadPath.EndsWith(Path.DirectorySeparatorChar.ToString(), StringComparison.Ordinal))
                    downloadPath += Path.DirectorySeparatorChar;

                using (ZipArchive archive = ZipFile.OpenRead(filePath + "\\" + zipName))
                {
                    foreach(ZipArchiveEntry entry in archive.Entries)
                    {
                        if(entry.FullName.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
                        {
                            string destinationPath = Path.GetFullPath(Path.Combine(filePath, entry.FullName));

                            entry.ExtractToFile(destinationPath);
                           // entry.
                        }
                    }
                }
            }
           
        }


Dave Kreskowiak

Вы разместили это как ответ на свой собственный вопрос, а не ответ кому-то еще. Из-за этого никто не получил уведомления о том, что вы что-то разместили.

Этот код выполняется полностью на сервере, а не на клиенте. Код, запущенный в браузере на стороне клиента, не может распаковать файл и показать содержимое из того, что было распаковано. Он не будет иметь доступа к ресурсам клиента, как и его файловая система.

Рейтинг:
2

Richard Deeming

Ваш код C# работает на сервере. Он не имеет доступа к файловой системе пользователя.

Вы не можете автоматически распаковать файл, загруженный пользователем. Вам придется позволить им самим распаковать файл.