首页 > 解决方案 > 如何将编码的 Base64 zip 文件解码为新的 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 文件,而是编码的 Base64 字符串。该 zip 的字节被编码为 Base64 字符串。我需要做的是使用收到的 Base64 字符串重新创建原始 zip 文件。

标签: c#.net-corebase64zip

解决方案


你得到什么样的文件根本不重要,因为你会收到一个二进制表示和它的文件名。它可以是一个.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);
    }

推荐阅读