yesman
yesman

Reputation: 7838

Byte array getting corrupted when passed to another method

I have a bunch of Jpg images in byte array form. I want to add these to a zip file, turn the zip file into a byte array, and pass it to somewhere else. In a method, I have this code:

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;

Now, I've added a filestream near the bottom to write it to a zipfile right away for testing purposes. This works, I get a zip file with 1 or more images in it on my desktop. However: response.ZipFile can not be made into a valid zipfile in the same way. I have tried this:

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);
}

But that creates a zipfile that can not be opened.

What I'm trying to do: turn response.ZipFileinto an array that can be turned into a working zipfile again. What am I doing wrong in this code?

Upvotes: 0

Views: 1231

Answers (1)

Dark Falcon
Dark Falcon

Reputation: 44201

How do you know that ZipArchive's Dispose doesn't write more to the underlying stream?

You should move this line to be after disposing the ZipArchive:

response.ZipFile = ms.ToArray();

Full code:

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;

Upvotes: 2

Related Questions