字节数组在传递给另一个方法时被破坏
Byte array getting corrupted when passed to another method
我有一堆字节数组形式的 Jpg 图片。我想将这些添加到 zip 文件中,将 zip 文件转换为字节数组,然后将其传递到其他地方。在一个方法中,我有这个代码:
var response = //some response object that will hold a byte array
using (var ms = new MemoryStream())
{
using (var zipArchive = new ZipArchive(ms, ZipArchiveMode.Create, true))
{
var i = 1;
foreach (var image in images) // some collection that holds byte arrays.
{
var entry = zipArchive.CreateEntry(i + ".jpg");
using (var entryStream = entry.Open())
using (var compressStream = new MemoryStream(photo.ImageOriginal))
{
compressStream.CopyTo(entryStream);
}
i++;
}
response.ZipFile = ms.ToArray();
}
using (var fs = new FileStream(@"C:\Users\MyName\Desktop\image.zip", FileMode.Create))
{
ms.Position = 0;
ms.CopyTo(fs);
}
}
return response;
现在,我在底部附近添加了一个文件流,以便立即将其写入 zip 文件以进行测试。这有效,我在桌面上得到了一个包含 1 个或多个图像的 zip 文件。但是:response.ZipFile
不能以相同的方式制成有效的 zip 文件。我试过这个:
using (var ms2 = new MemoryStream(response.ZipFile))
using (var fs = new FileStream(@"C:\Users\Bara\Desktop\image.zip", FileMode.Create))
{
ms2.Position = 0;
ms2.CopyTo(fs);
}
但这会创建一个无法打开的 zip 文件。
我想做的是:将 response.ZipFile
变成一个可以再次变成工作 zip 文件的数组。我在这段代码中做错了什么?
您怎么知道 ZipArchive
的 Dispose
不会向基础流写入更多内容?
您应该将此行移动到配置 ZipArchive
之后:
response.ZipFile = ms.ToArray();
完整代码:
var response = //some response object that will hold a byte array
using (var ms = new MemoryStream())
{
using (var zipArchive = new ZipArchive(ms, ZipArchiveMode.Create, true))
{
var i = 1;
foreach (var image in images) // some collection that holds byte arrays.
{
var entry = zipArchive.CreateEntry(i + ".jpg");
using (var entryStream = entry.Open())
using (var compressStream = new MemoryStream(photo.ImageOriginal))
{
compressStream.CopyTo(entryStream);
}
i++;
}
}
response.ZipFile = ms.ToArray();
}
return response;
我有一堆字节数组形式的 Jpg 图片。我想将这些添加到 zip 文件中,将 zip 文件转换为字节数组,然后将其传递到其他地方。在一个方法中,我有这个代码:
var response = //some response object that will hold a byte array
using (var ms = new MemoryStream())
{
using (var zipArchive = new ZipArchive(ms, ZipArchiveMode.Create, true))
{
var i = 1;
foreach (var image in images) // some collection that holds byte arrays.
{
var entry = zipArchive.CreateEntry(i + ".jpg");
using (var entryStream = entry.Open())
using (var compressStream = new MemoryStream(photo.ImageOriginal))
{
compressStream.CopyTo(entryStream);
}
i++;
}
response.ZipFile = ms.ToArray();
}
using (var fs = new FileStream(@"C:\Users\MyName\Desktop\image.zip", FileMode.Create))
{
ms.Position = 0;
ms.CopyTo(fs);
}
}
return response;
现在,我在底部附近添加了一个文件流,以便立即将其写入 zip 文件以进行测试。这有效,我在桌面上得到了一个包含 1 个或多个图像的 zip 文件。但是:response.ZipFile
不能以相同的方式制成有效的 zip 文件。我试过这个:
using (var ms2 = new MemoryStream(response.ZipFile))
using (var fs = new FileStream(@"C:\Users\Bara\Desktop\image.zip", FileMode.Create))
{
ms2.Position = 0;
ms2.CopyTo(fs);
}
但这会创建一个无法打开的 zip 文件。
我想做的是:将 response.ZipFile
变成一个可以再次变成工作 zip 文件的数组。我在这段代码中做错了什么?
您怎么知道 ZipArchive
的 Dispose
不会向基础流写入更多内容?
您应该将此行移动到配置 ZipArchive
之后:
response.ZipFile = ms.ToArray();
完整代码:
var response = //some response object that will hold a byte array
using (var ms = new MemoryStream())
{
using (var zipArchive = new ZipArchive(ms, ZipArchiveMode.Create, true))
{
var i = 1;
foreach (var image in images) // some collection that holds byte arrays.
{
var entry = zipArchive.CreateEntry(i + ".jpg");
using (var entryStream = entry.Open())
using (var compressStream = new MemoryStream(photo.ImageOriginal))
{
compressStream.CopyTo(entryStream);
}
i++;
}
}
response.ZipFile = ms.ToArray();
}
return response;