Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Can';t打开从System.IO.Compression命名空间创建的zip文件_Javascript_Ajax_Asp.net Core_System.io.compression - Fatal编程技术网

Javascript Can';t打开从System.IO.Compression命名空间创建的zip文件

Javascript Can';t打开从System.IO.Compression命名空间创建的zip文件,javascript,ajax,asp.net-core,system.io.compression,Javascript,Ajax,Asp.net Core,System.io.compression,我正在尝试压缩不同数量的文件,这样就可以为用户提供一个zip文件夹,而不必单击多个定位标记。我正在使用asp.net core 3.1中的System.IO.Compression命名空间创建zip文件夹 public IActionResult DownloadPartFiles(string[] fileLocations, string[] fileNames) { List<InMemoryFile> files = n

我正在尝试压缩不同数量的文件,这样就可以为用户提供一个zip文件夹,而不必单击多个定位标记。我正在使用asp.net core 3.1中的System.IO.Compression命名空间创建zip文件夹

        public IActionResult DownloadPartFiles(string[] fileLocations, string[] fileNames)
        {
            List<InMemoryFile> files = new List<InMemoryFile>();
            for (int i = 0; i < fileNames.Length; i++)
            {
                InMemoryFile inMemoryFile = GetInMemoryFile(fileLocations[i], fileNames[i]).Result;
                files.Add(inMemoryFile);
            }
            byte[] archiveFile;
            using (MemoryStream archiveStream = new MemoryStream())
            {
                using (ZipArchive archive = new ZipArchive(archiveStream, ZipArchiveMode.Create, true))
                {
                    foreach (InMemoryFile file in files)
                    {
                        ZipArchiveEntry zipArchiveEntry = archive.CreateEntry(file.FileName, CompressionLevel.Fastest);
                        using (Stream zipStream = zipArchiveEntry.Open())
                        {
                            zipStream.Write(file.Content, 0, file.Content.Length);
                            zipStream.Close();
                        }
                    }
                    archiveStream.Position = 0;
                }
                archiveFile = archiveStream.ToArray();
            }

            return File(archiveFile, "application/octet-stream");
        }
下面是我用来创建Zip文件夹的代码

        public IActionResult DownloadPartFiles(string[] fileLocations, string[] fileNames)
        {
            List<InMemoryFile> files = new List<InMemoryFile>();
            for (int i = 0; i < fileNames.Length; i++)
            {
                InMemoryFile inMemoryFile = GetInMemoryFile(fileLocations[i], fileNames[i]).Result;
                files.Add(inMemoryFile);
            }
            byte[] archiveFile;
            using (MemoryStream archiveStream = new MemoryStream())
            {
                using (ZipArchive archive = new ZipArchive(archiveStream, ZipArchiveMode.Create, true))
                {
                    foreach (InMemoryFile file in files)
                    {
                        ZipArchiveEntry zipArchiveEntry = archive.CreateEntry(file.FileName, CompressionLevel.Fastest);
                        using (Stream zipStream = zipArchiveEntry.Open())
                        {
                            zipStream.Write(file.Content, 0, file.Content.Length);
                            zipStream.Close();
                        }
                    }
                    archiveStream.Position = 0;
                }
                archiveFile = archiveStream.ToArray();
            }

            return File(archiveFile, "application/octet-stream");
        }

据我所知,Ajax不是接收字节数组和二进制数据的最佳选择。使用这种方法,我可以用7-zip打开一个zip文件,但不能打开Windows,然而,存档中的一个文件显示为0KB大小,无法打开。档案中的其他三个文件都很好。但是,其他包含不同文件的zip文件夹根本无法打开。

过了一段时间,我发现一篇帖子能够解决我的问题

从那篇文章来看,这是我用来创建包含文件的zip文件夹的改进方法

        public IActionResult DownloadPartFiles([FromBody] FileRequestParameters parameters)
        {
            List<InMemoryFile> files = new List<InMemoryFile>();
            for (int i = 0; i < parameters.FileNames.Length; i++)
            {
                InMemoryFile inMemoryFile = GetInMemoryFile(parameters.FileLocations[i], parameters.FileNames[i]).Result;
                files.Add(inMemoryFile);
            }
            byte[] archiveFile = null;
            using (MemoryStream archiveStream = new MemoryStream())
            {
                using (ZipArchive archive = new ZipArchive(archiveStream, ZipArchiveMode.Create, true))
                {
                    foreach (InMemoryFile file in files)
                    {
                        ZipArchiveEntry zipArchiveEntry = archive.CreateEntry(file.FileName, CompressionLevel.Optimal);
                        using (MemoryStream originalFileStream = new MemoryStream(file.Content))
                        using (Stream zipStream = zipArchiveEntry.Open())
                        {
                            originalFileStream.CopyTo(zipStream);
                        }
                    }
                }
                archiveFile = archiveStream.ToArray();
            }
            return File(archiveFile, "application/octet-stream");
        }
public IActionResult DownloadPartFiles([FromBody]FileRequestParameters)
{
列表文件=新列表();
对于(int i=0;i

我仍然不知道以前的方法为什么会出现问题,因此如果将来有人知道答案,我很想知道。

您是否调试了此方法,以确保通过POST请求发送的数据被正确接收?另外,为什么在请求参数中显示
dataType:“html”
?是的,文件位置和文件名都很好。至于数据类型,那是我这边的一个错误。我删除了它,但仍然得到相同的结果。
        var parameters = {};
        parameters.FileLocations = urls;
        parameters.FileNames = fileNames;

        var xmlhttp = new XMLHttpRequest();
        xmlhttp.open("POST", "/WebOrder/DownloadPartFiles/", true);
        xmlhttp.setRequestHeader("Content-Type", "application/json");
        xmlhttp.responseType = "arraybuffer";

        xmlhttp.onload = function (oEvent) {
            var arrayBuffer = xmlhttp.response;
            if (arrayBuffer) {
                var byteArray = new Uint8Array(arrayBuffer);
                var blob = new Blob([byteArray], { type: "application/zip" });
                var link = document.createElement('a');
                link.href = window.URL.createObjectURL(blob);
                link.download = "PartFiles.zip";
                link.click();
                window.URL.revokeObjectURL(blob);
            }
        }

        xmlhttp.send(JSON.stringify(parameters));
        public IActionResult DownloadPartFiles([FromBody] FileRequestParameters parameters)
        {
            List<InMemoryFile> files = new List<InMemoryFile>();
            for (int i = 0; i < parameters.FileNames.Length; i++)
            {
                InMemoryFile inMemoryFile = GetInMemoryFile(parameters.FileLocations[i], parameters.FileNames[i]).Result;
                files.Add(inMemoryFile);
            }
            byte[] archiveFile = null;
            using (MemoryStream archiveStream = new MemoryStream())
            {
                using (ZipArchive archive = new ZipArchive(archiveStream, ZipArchiveMode.Create, true))
                {
                    foreach (InMemoryFile file in files)
                    {
                        ZipArchiveEntry zipArchiveEntry = archive.CreateEntry(file.FileName, CompressionLevel.Optimal);
                        using (MemoryStream originalFileStream = new MemoryStream(file.Content))
                        using (Stream zipStream = zipArchiveEntry.Open())
                        {
                            originalFileStream.CopyTo(zipStream);
                        }
                    }
                }
                archiveFile = archiveStream.ToArray();
            }
            return File(archiveFile, "application/octet-stream");
        }