@@ -133,40 +133,29 @@ public static ExportFile ToPdf<T>(this IEnumerable<T> data,
133133 return ReturnFileOrZippedVersion ( datatable , files , MimeTypes . Pdf ) ;
134134 }
135135
136- public static ExportFile ToFileFormat < T > ( this IEnumerable < T > data , ExportType type )
136+ private static ExportFile CreateZip ( string baseName , MimeTypes innerType , IReadOnlyList < byte [ ] > parts )
137137 {
138- return type switch
138+ using var ms = new MemoryStream ( ) ;
139+ using ( var zip = new ZipArchive ( ms , ZipArchiveMode . Create , leaveOpen : true ) )
139140 {
140- ExportType . Xlsx => data . ToXlsx ( ) ,
141- ExportType . Csv => data . ToCsv ( ) ,
142- ExportType . Pdf => data . ToPdf ( ) ,
143- _ => throw new ArgumentOutOfRangeException ( nameof ( type ) , type , null )
144- } ;
145- }
141+ for ( var i = 0 ; i < parts . Count ; i ++ )
142+ {
143+ var entryName = parts . Count == 1
144+ ? $ "{ baseName } { innerType . Extension } "
145+ : $ "{ baseName } _{ i + 1 } { innerType . Extension } ";
146146
147- private static ExportFile Zip ( string fileName , MimeTypes mimeType , List < byte [ ] > files )
148- {
149- using var memoryStream = new MemoryStream ( ) ;
150- using var archive = new ZipArchive ( memoryStream , ZipArchiveMode . Create , true ) ;
151- {
152- }
153- for ( var i = 0 ; i < files . Count ; i ++ )
154- {
155- var entry = archive . CreateEntry ( fileName + Suffix ( i ) , CompressionLevel . Optimal ) ;
156- using var entryStream = entry . Open ( ) ;
157- entryStream . Write ( files [ i ] , 0 , files [ i ] . Length ) ;
158- }
147+ var entry = zip . CreateEntry ( entryName , CompressionLevel . Optimal ) ;
159148
160- archive . Dispose ( ) ; //don't delete this line otherwize file will be corrupted
161-
162- return new ExportFile ( fileName , MimeTypes . Zip , memoryStream . ToArray ( ) ) ;
163-
164- string Suffix ( int index )
165- {
166- return files . Count == 1 ? $ "{ mimeType . Extension } " : $ "_{ index + 1 } { mimeType . Extension } ";
149+ using var es = entry . Open ( ) ;
150+ es . Write ( parts [ i ] ) ;
151+ }
167152 }
153+
154+ // no extra ToArray(); MemoryStream already owns the buffer we need
155+ return new ExportFile ( $ "{ baseName } .zip", MimeTypes . Zip , ms . GetBuffer ( ) [ ..( int ) ms . Length ] ) ;
168156 }
169157
158+
170159 private static ExportFile ReturnFileOrZippedVersion < T > ( DataTable < T > dataTable , List < byte [ ] > files , MimeTypes type )
171160 {
172161 if ( files . Count == 1 && files . First ( )
@@ -175,6 +164,6 @@ private static ExportFile ReturnFileOrZippedVersion<T>(DataTable<T> dataTable, L
175164 return new ExportFile ( dataTable . Name , type , files . First ( ) ) ;
176165 }
177166
178- return Zip ( dataTable . Name , type , files ) ;
167+ return CreateZip ( dataTable . Name , type , files ) ;
179168 }
180169}
0 commit comments