Как мне декодировать закодированный файл zip Base64 в новый файл zip? - PullRequest
0 голосов
/ 13 марта 2019

Я пытаюсь создать zip-файл из закодированной строки base64, но я застрял при получении файлов из строки.

Мне удалось создать из него zip-файл, но я не вижу файла, который должен быть в нем.

Пока мой код:

public static void Main(string[] args)
{
    IConfiguration config = new ConfigurationBuilder()
        .AddJsonFile("appsettings.json", false, true)
        .Build();

    var fileName = args[0];
    var path = $"{config["zipPath"]}\\{fileName}";

    byte[] zipBytes = Convert.FromBase64String(args[1]);
    using(var memoryStream = new MemoryStream(zipBytes))
    {
        // without this I can't open my zip file
        using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
        {
        }

        using (var fileStream = new FileStream(path, FileMode.Create))
        {
            memoryStream.Seek(0, SeekOrigin.Begin);
            memoryStream.CopyTo(fileStream);
        }
   }
}

Разъяснение

Строка, которую я декодирую, является зашифрованным zip-файлом. Я получил строку Base64, и мне нужно декодировать ее и создать ZIP-файл, который совпадает с оригиналом, включая файлы, которые были заархивированы.

Дальнейшее уточнение

Я получаю zip-файл от третьего лица. Однако я не получаю его в виде zip-файла, я получаю его в виде закодированной строки Base64. Байты этого zip кодируются в строку Base64. Что мне нужно сделать, так это воссоздать исходный zip-файл, используя полученную строку Base64.

Ответы [ 3 ]

1 голос
/ 13 марта 2019

Неважно, какой файл вы получаете, потому что вы получаете двоичное представление и имя файла. Это может быть .JPG, .VHD виртуальный диск, .MDB база данных, что угодно.

Таким образом, вы можете опустить memoryStream и theZipArchive, просто записав двоичные данные в файл с расширением .zip:

  public static void Main(string[] args)
{
    var path = @"c:\temp\fileName2.zip";
    byte[] zipBytes = Convert.FromBase64String("UEsDBBQAAAAIAC5YR063vtp6EwEAALcBAAAJAAAAcHJpbWUudHh0ZZDfSsMwFMbvA3mHPoBCkv5Ze5EL1zkVnBPX2QsRmdtxLWuTkmSyvb0nUaogBHLO73x8+U6eRbIcXKuVLbX6BONgJzkl9c36bvaGvcWRFJSsnAFrK7AOjBesLTyatgcFTjJKFq2qtHFHA/N5JbnIEW1OfxETCSU/YAG9zMeuQhsZB48pqG3j5YIl3xYjyXmBMUJ7bYw2ZQPbg386oKuuK3U/dHDyYZeqOwecZpN81JQaV/DZQ3d7HnDbxsBm9wtrbQ64s+QX6IKeAY4GIShPKbmHDyfjPMv8DoMUeD+1+8bJNGZYT7VzupcFQ2nNJYtYxBMhorgosLzk48GxwLHnQTD5L6DkJfzzA7hXSmbwftz7PF9QSwECFAAUAAAACAAuWEdOt77aehMBAAC3AQAACQAAAAAAAAABACAAAAAAAAAAcHJpbWUudHh0UEsFBgAAAAABAAEANwAAADoBAAAAAA==");
    using (FileStream fs = new FileStream(path, FileMode.Create))
    {
        fs.Write(zipBytes,0,zipBytes.Length);
    }
}

(я создал строку base64 из ZIP-файла ранее)

var path = @"c:\temp\import.zip";
    string base64 = "";

    using (FileStream zip = new FileStream(path, FileMode.Open))
    {
        var zipBytes = new byte[zip.Length];
        zip.Read(zipBytes,0,(int)zip.Length);
        base64 = Convert.ToBase64String(zipBytes);
    }
1 голос
/ 13 марта 2019

Я предлагаю использовать метод ZipFile CreateFromDirectory

public static void Main(string[] args)
{
    IConfiguration config = new ConfigurationBuilder()
        .AddJsonFile("appsettings.json", false, true)
        .Build();

    var fileName = args[0];
    var path = $"{config["zipPath"]}\\{fileName}";
    string extractPath = @"c:\users\exampleuser\extract";

    byte[] zipBytes = Convert.FromBase64String(args[1]);
    using(var memoryStream = new MemoryStream(zipBytes))
    {
        using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Read))
        {
            archive.ExtractToDirectory(extractPath);
        }

        ZipFile.CreateFromDirectory(extractPath, path);
   }
}
0 голосов
/ 13 марта 2019

Прочитать весь текст из файла:

пример:

string text = System.IO.File.ReadAllText(@"C:\demofile.txt");

Затем преобразовать строку base64 из текстового файла в байты

пример:

byte[] bytes = Convert.FromBase64String(text);

Затем вы можете записать эти байты в zip-файл

пример:

File.WriteAllBytes(@"C:\demofile_zip.zip", bytes);

Если вы хотите извлечь из памяти, просто загрузите ее в поток памяти

пример:

using (var compressedStream = new MemoryStream(bytes2))
{
    using (FileStream decompressedFileStream = File.Create(@"C:\demofile_installer.msi"))
    {
        using (GZipStream decompressionStream = new GZipStream(compressedStream, CompressionMode.Decompress))
        {
            decompressionStream.CopyTo(decompressedFileStream);
        }
    }
}
...