我正在尝试从已编码的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文件。
答案 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);
}
}
}