asp.netはファイルを圧縮してダウンロードします

1.ファイルをブロック単位で読み取り、圧縮リストに追加してから、圧縮ファイルを作成します(ICSharpCode.SharpZipLib.dll、v0.86.0.518を使用)

string zipFileName = MatchPath(context, System.IO.Path.GetFileNameWithoutExtension(excelsavepath) + ".zip");
                ZipEntryFactory zipEntryFactory = new ZipEntryFactory();
                zipEntryFactory.NameTransform = new MyNameTransfom(renameDictionary);

                using (ZipOutputStream outPutStream = new ZipOutputStream(File.Create(zipFileName)))
                {
                    outPutStream.SetLevel(9);
                    ZipEntry entry = null;
                    byte[] buffer = null;
                    foreach (string file in renameDictionary.Keys)
                    {
                        if (File.Exists(file) == false)
                            continue;
                        buffer = new byte[4096];
                        entry = zipEntryFactory.MakeFileEntry(file);
                        outPutStream.PutNextEntry(entry);
                        using (FileStream fileStream = File.OpenRead(file))
                        {
                            StreamUtils.Copy(fileStream, outPutStream, buffer);
                            //count = 0;
                            //while ((count = fileStream.Read(buffer, 0, buffer.Length)) > 0)
                            //{
                            //    outPutStream.Write(buffer, 0, count);
                            //}
                        }
                    }
                    outPutStream.Finish();
                    outPutStream.Close();
                }
                GC.Collect();
                GC.WaitForPendingFinalizers();

2.バックエンドは圧縮ファイルを出力します。ダウンロードファイルをチャンクで出力します(メモリオーバーフローを回避するために比較的大きなファイルを処理する場合のみ)

	/// <summary>
        /// 使用OutputStream.Write分块下载文件,参数为文件绝对路径
        /// </summary>
        /// <param name="FileName"></param>
        public static void DownLoadFile(HttpContext context,string filePath)
        {
            //指定块大小
            long chunkSize = 204800;
            //建立一个200K的缓冲区
            byte[] buffer = new byte[chunkSize];
            //已读的字节数
            long dataToRead = 0;

            context.Response.Clear();
            context.Response.ClearContent();
            context.Response.ClearHeaders();
            context.Response.ContentType = "application/octet-stream";
            string encodeFileName = Path.GetFileName(filePath);
            if (context.Request.UserAgent.ToLower().IndexOf("msie") > -1)
                encodeFileName = HttpUtility.UrlPathEncode(encodeFileName);
            if (context.Request.UserAgent.ToLower().IndexOf("firefox") > -1)
                encodeFileName = "\"" + encodeFileName + "\"";
            else
                encodeFileName = HttpUtility.UrlEncode(encodeFileName, System.Text.Encoding.UTF8);
            try
            {
                using (FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
                {
                    dataToRead = stream.Length;
                    context.Response.AddHeader("Content-Disposition", "attachement;filename=" + encodeFileName);
                    context.Response.AddHeader("Content-Transfer-Encoding", "binary");
                    context.Response.AddHeader("Content-Length", dataToRead.ToString());
                    while (dataToRead > 0)
                    {
                        if (context.Response.IsClientConnected)
                        {
                            int length = stream.Read(buffer, 0, Convert.ToInt32(chunkSize));
                            context.Response.OutputStream.Write(buffer, 0, length);
                            context.Response.Flush();
                            buffer = new Byte[chunkSize];
                            dataToRead = dataToRead - length;
                        }
                        else
                            dataToRead = -1;
                    }
                }
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                //context.Response.Close();
            }
        }



おすすめ

転載: blog.csdn.net/fuweiping/article/details/72896949