如何将编码的Base64 zip文件解码为新的zip文件?

时间:2019-03-13 12:03:39

标签: c# .net-core base64 zip

我正在尝试从已编码的base64字符串中创建一个zip文件,但是我一直坚持从字符串中获取文件。

我已经可以从中创建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文件。但是,我没有将其作为zip文件接收,而是将其作为编码的Base64字符串接收。该zip的字节被编码为Base64字符串。 我需要做的是使用收到的Base64字符串重新创建原始的zip文件。

3 个答案:

答案 0 :(得分:1)

获取哪种文件根本无关紧要,因为您会收到二进制表示形式和文件名。它可以是.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);
    }
}

(我之前从.zip创建了base64字符串)

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 :(得分:1)

我的建议是使用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);
   }
}

答案 2 :(得分:0)

读取文件中的所有文本:

示例:

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