SP 文件到 .zip

SPFiles to .zip

如标题所示,我有一个 SPFiles(共享点附件)列表,我需要将其压缩并推送给用户下载。

我在这里找了一些示例并尝试编写一些代码但没有成功。

这是我到现在为止的最后一次尝试

 using (var stream = new MemoryStream())
        {
            using (var archive = new ZipArchive(stream, ZipArchiveMode.Create, true))
            {
                foreach (SPFile item in lstFiles)
                {
                    //string nomeEntrada = item.Substring(item.LastIndexOf("/") + 1);
                    var file = archive.CreateEntry(item.Name);
                    using (var entryStream = file.Open())
                    using (var streamWriter = new BinaryWriter(entryStream))
                    {
                        byte[] bytes = item.OpenBinary();
                        streamWriter.Write(bytes, 0, bytes.Length);
                    }
                }
            }
            //For testing only, to check if the .zip is beeing correctly generated
            using (FileStream file = new FileStream("C:\teste\file.zip", FileMode.Create, System.IO.FileAccess.Write))
            {
                stream.Seek(0, SeekOrigin.Begin);
                stream.CopyTo(file);
            }

            HttpContext.Current.Response.Clear();
            HttpContext.Current.Response.ContentType = "application/x-zip-compressed";
            HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=anexos.zip");
            HttpContext.Current.Response.BinaryWrite(stream.ToArray());
            HttpContext.Current.Response.Flush();
            HttpContext.Current.Response.Close();
            HttpContext.Current.ApplicationInstance.CompleteRequest();
            HttpContext.Current.Response.End();
        }

PS: 我不想将文件保存在服务器目录中,那只是为了检查文件是否正常

我创建了一个应用程序页面并将用户重定向到它。因为我可以在那里控制 httpcontext,所以我编写了以下代码并且它工作得很好。该页面快速将文件流式传输到客户端,然后它们自行关闭。希望对你有帮助

    using (var stream = new MemoryStream())
                    {
                        using (var archive = new ZipArchive(stream, ZipArchiveMode.Create, true))
                        {
                            foreach (SPFile item in lstFiles)
                            {

                                var file = archive.CreateEntry(item.Name);
                                using (var entryStream = file.Open())
                                using (var streamWriter = new BinaryWriter(entryStream))
                                {
                                    byte[] bytes = item.OpenBinary();
                                    streamWriter.Write(bytes, 0, bytes.Length);
                                }
                            }
                        }

                        stream.Seek(0, SeekOrigin.Begin);
                        Byte[] byteArray = stream.ToArray();

                        HttpContext.Current.Response.Buffer = true;
                        HttpContext.Current.Response.Clear();
                        HttpContext.Current.Response.ClearHeaders();
                        HttpContext.Current.Response.CacheControl = "public";
                        HttpContext.Current.Response.AddHeader("Pragma", "public");
                        HttpContext.Current.Response.AddHeader("Expires", "0");
                        HttpContext.Current.Response.AddHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
                        HttpContext.Current.Response.AddHeader("Content-Description", "Report Export");
                        HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=\"Anexos.zip\"");

                        HttpContext.Current.Response.BinaryWrite(byteArray);
                        HttpContext.Current.Response.Flush(); // Sends all currently buffered output to the client.
                        HttpContext.Current.Response.SuppressContent = true;  // Gets or sets a value indicating whether to send HTTP content to the client.
                        HttpContext.Current.ApplicationInstance.CompleteRequest(); // Causes ASP.NET to bypass all events and filtering in the HTTP pipeline chain of execution and directly execute the EndRequest event.
                    }