在内存中压缩
在C#开发只中,我们经常需要对文件进行压缩和解压缩操作。而有时候,我们希望将文件流直接压缩到内存中,而不是将其保存到磁盘上。这在一些特定的场景下非常有用,比如在处理大量文件时,可以减少磁盘读写的开销。首先,我们需要创建ZipArchive类创建一个新的压缩文件,并将其与MemoryStream关联起来。然后,我们可以通过向ZipArchive实例添加文件条目来将文件流添加到压缩文件中。最后,我们将压缩后的文件流保存到内存中,并可以进一步处理或发送给其他地方
下面是一个示例代码,演示了如何使用ZipArchive在内存中压缩文件流,前端接收处理后下载。
后端:
//创建一个zip内存流
using (var zipmemory = new MemoryStream())
{
//创建一个zip文件夹
using (ZipArchive archive = new ZipArchive(zipmemory, ZipArchiveMode.Create))
{
//currentFiles :文件集合
if (currentFiles.Count() <= 0)
{
//特殊处理
}
foreach (var currentFile in currentFiles)
{
var parPath = "";//上级文件夹名:可以多个 用'/'或者'\'隔开
//创建文件夹下的文件
ZipArchiveEntry readmeEntry = archive.CreateEntry($"{parPath}/{currentFile.FileName}");
//打开文件
using (var readmeStream = readmeEntry.Open())
{
//将文件流写入文件
readmeStream.Write(currentFile.Bytes);
}
}
}
return zipmemory.ToArray();
}
注意:文件夹名不能包含下列任何字符:\/:*?"<>|
前端:
// res:后端返回的内存流
let raw = window.atob(res);
let rawLength = raw.length;
let uInt8Array = new Uint8Array(rawLength);
for (let i = 0; i < rawLength; ++i) {
uInt8Array[i] = raw.charCodeAt(i);
}
let a = document.createElement("a");
var href = window.URL.createObjectURL(new Blob([uInt8Array], {type: "application/zip"}));//创建下载的链接
a.href = href;
a.download = name;//name:定义文件名
a.style.display = "none";
document.body.appendChild(a);
try {
a.click(); // 触发点击
} finally {
document.body.removeChild(a); // 然后移除
window.URL.revokeObjectURL(href); //释放掉blob对象
}
实现效果
在本地压缩见下篇~~~