C# 将多个文件压缩到内存流中
我已经研究过类似问题的答案,但还没有看到将多个文件收集到一个ziparchive中进行传输下载的问题。以下内容没有给出任何错误,但不会返回可识别的zip文件C# 将多个文件压缩到内存流中,c#,memorystream,ziparchive,C#,Memorystream,Ziparchive,我已经研究过类似问题的答案,但还没有看到将多个文件收集到一个ziparchive中进行传输下载的问题。以下内容没有给出任何错误,但不会返回可识别的zip文件 public async Task<HttpResponseMessage> SendAZipOfFiles() { var memoryStream = new MemoryStream(); var response = new HttpResponseMessage(HttpStatusCode.O
public async Task<HttpResponseMessage> SendAZipOfFiles()
{
var memoryStream = new MemoryStream();
var response = new HttpResponseMessage(HttpStatusCode.OK);
List<string> filepaths = await GetSomeFiles();
using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
{
foreach (string filepath in filepaths)
{
string filename = Path.GetFileName(filepath);
using (StreamReader reader = new StreamReader(filepath))
using (StreamWriter writer = new StreamWriter(archive.CreateEntry(filename).Open()))
{
writer.Write(reader.ReadToEnd());
}
}
}
memoryStream.Position = 0;
response.Content = new StreamContent(memoryStream);
response.Content.Headers.ContentLength = memoryStream.Length;
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = "TheFile.zip")
};
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/zip");
return response;
}
公共异步任务SendAZipOfFiles()
{
var memoryStream=新的memoryStream();
var响应=新的HttpResponseMessage(HttpStatusCode.OK);
List filepath=await GetSomeFiles();
使用(var archive=new ZipArchive(memoryStream,ZipArchiveMode.Create,true))
{
foreach(文件路径中的字符串文件路径)
{
字符串filename=Path.GetFileName(filepath);
使用(StreamReader=新StreamReader(文件路径))
使用(StreamWriter writer=newstreamwriter(archive.CreateEntry(filename.Open()))
{
writer.Write(reader.ReadToEnd());
}
}
}
memoryStream.Position=0;
response.Content=新的流内容(memoryStream);
response.Content.Headers.ContentLength=memoryStream.Length;
response.Content.Headers.ContentDisposition=新的ContentDispositionHeaderValue(“附件”)
{
FileName=“TheFile.zip”)
};
response.Content.Headers.ContentType=新的MediaTypeHeaderValue(“应用程序/zip”);
返回响应;
}
我看到您正在使用StreamReader
和StreamWriter
,这两种方法不仅对您的目的没有用处,而且可能会产生编码问题,因为它们专门用于读取和写入文本文件
如果您需要向存档中添加任何类型的文件,而不仅仅是纯文本文件,则在读/写时可能会损坏数据
相反,只需将原始流复制到存档条目:
public async Task<HttpResponseMessage> SendAZipOfFiles()
{
var memoryStream = new MemoryStream();
var response = new HttpResponseMessage(HttpStatusCode.OK);
List<string> filepaths = await GetSomeFiles();
using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
{
foreach (string filepath in filepaths)
{
string filename = Path.GetFileName(filepath);
var entry = archive.CreateEntry(filename);
using (var file = File.OpenRead(filename))
using (var entryStream = entry.Open())
{
await file.CopyToAsync(entryStream);
}
}
}
memoryStream.Position = 0;
response.Content = new StreamContent(memoryStream);
response.Content.Headers.ContentLength = memoryStream.Length;
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = "TheFile.zip")
};
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/zip");
return response;
}
公共异步任务SendAZipOfFiles()
{
var memoryStream=新的memoryStream();
var响应=新的HttpResponseMessage(HttpStatusCode.OK);
List filepath=await GetSomeFiles();
使用(var archive=new ZipArchive(memoryStream,ZipArchiveMode.Create,true))
{
foreach(文件路径中的字符串文件路径)
{
字符串filename=Path.GetFileName(filepath);
var entry=archive.CreateEntry(文件名);
使用(var file=file.OpenRead(文件名))
使用(var entryStream=entry.Open())
{
wait file.CopyToAsync(entryStream);
}
}
}
memoryStream.Position=0;
response.Content=新的流内容(memoryStream);
response.Content.Headers.ContentLength=memoryStream.Length;
response.Content.Headers.ContentDisposition=新的ContentDispositionHeaderValue(“附件”)
{
FileName=“TheFile.zip”)
};
response.Content.Headers.ContentType=新的MediaTypeHeaderValue(“应用程序/zip”);
返回响应;
}
我看到您正在使用StreamReader
和StreamWriter
,这两种方法不仅对您的目的没有用处,而且可能会产生编码问题,因为它们专门用于读取和写入文本文件
如果您需要向存档中添加任何类型的文件,而不仅仅是纯文本文件,则在读/写时可能会损坏数据
相反,只需将原始流复制到存档条目:
public async Task<HttpResponseMessage> SendAZipOfFiles()
{
var memoryStream = new MemoryStream();
var response = new HttpResponseMessage(HttpStatusCode.OK);
List<string> filepaths = await GetSomeFiles();
using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
{
foreach (string filepath in filepaths)
{
string filename = Path.GetFileName(filepath);
var entry = archive.CreateEntry(filename);
using (var file = File.OpenRead(filename))
using (var entryStream = entry.Open())
{
await file.CopyToAsync(entryStream);
}
}
}
memoryStream.Position = 0;
response.Content = new StreamContent(memoryStream);
response.Content.Headers.ContentLength = memoryStream.Length;
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = "TheFile.zip")
};
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/zip");
return response;
}
公共异步任务SendAZipOfFiles()
{
var memoryStream=新的memoryStream();
var响应=新的HttpResponseMessage(HttpStatusCode.OK);
List filepath=await GetSomeFiles();
使用(var archive=new ZipArchive(memoryStream,ZipArchiveMode.Create,true))
{
foreach(文件路径中的字符串文件路径)
{
字符串filename=Path.GetFileName(filepath);
var entry=archive.CreateEntry(文件名);
使用(var file=file.OpenRead(文件名))
使用(var entryStream=entry.Open())
{
wait file.CopyToAsync(entryStream);
}
}
}
memoryStream.Position=0;
response.Content=新的流内容(memoryStream);
response.Content.Headers.ContentLength=memoryStream.Length;
response.Content.Headers.ContentDisposition=新的ContentDispositionHeaderValue(“附件”)
{
FileName=“TheFile.zip”)
};
response.Content.Headers.ContentType=新的MediaTypeHeaderValue(“应用程序/zip”);
返回响应;
}
原来我的问题出在打字脚本方面
我确实更改了代码,替换了:
string filename = Path.GetFileName(filepath);
using (StreamReader reader = new StreamReader(filepath))
using (StreamWriter writer = new
StreamWriter(archive.CreateEntry(filename).Open()))
{
writer.Write(reader.ReadToEnd());
}
使用更简单的:
archive.CreateEntryFromFile(filepath, Path.GetFileName(filepath));
结果发现我的问题出在打字方面 我确实更改了代码,替换了:
string filename = Path.GetFileName(filepath);
using (StreamReader reader = new StreamReader(filepath))
using (StreamWriter writer = new
StreamWriter(archive.CreateEntry(filename).Open()))
{
writer.Write(reader.ReadToEnd());
}
使用更简单的:
archive.CreateEntryFromFile(filepath, Path.GetFileName(filepath));
但是当你将拉链部分作为一个单独的方法进行分解时,它就变得更容易进行(单元)测试了。旁注,但是当你将拉链部分作为一个单独的方法进行分解时,它就变得更容易进行(单元)测试了。