我有一个MemoryStream从DataTable中提取数据。目前,这将提供给MailMessage附件并邮寄附加到邮件的csv。我需要做的是压缩和压缩它。
所以现在我正在遍历DataTable的每一行,添加适当的逗号并将其流式传输。它会生成带有数据的.bin文件。通过添加名称作为Attachment参数,它将作为有效的csv文件发送给客户端。
mail.Attachments.Add(new Attachment(stream, "report.csv"));
在将它添加为附件之前,任何人都可以帮助我如何压缩和压缩csv吗?最好没有外部库。谢谢。
答案 0 :(得分:3)
对于之前的答案,使用这样的模型,
public FileModel(){
public string FileName {get;set;}
public Stream FileStream {get;set;}
}
定义了以下扩展方法来创建要流式传输的zip存档。
public static class ZipArchiveExtensions {
public static Stream Compress(this IEnumerable<FileModel> files) {
if (files.Any()) {
var ms = new MemoryStream();
var archive = new ZipArchive(ms, ZipArchiveMode.Create, false);
foreach (var file in files) {
var entry = archive.add(file);
}
ms.Position = 0;
return ms;
}
return null;
}
private static ZipArchiveEntry add(this ZipArchive archive, FileModel file) {
var entry = archive.CreateEntry(file.FileName, CompressionLevel.Fastest);
using (var stream = entry.Open()) {
file.FileStream.CopyTo(stream);
stream.Position = 0;
stream.Close();
}
return entry;
}
}
使用它,您现在可以在将压缩的csv文件作为附件添加之前添加一个步骤
//...other code
var files = new FileModel[] {
new FileModel {
FileName = "report1.csv",
FileStream = stream
},
new FileModel {
FileName = "report2.xlsx",
FileStream = stream2
}
};
var zipStream = files.Compress();
mail.Attachments.Add(new Attachment(zipStream, "reports.zip"));
//...other code