C# 如何从Azure Blob存储下载、解压缩和反序列化对象/文件?
此代码将压缩并序列化对象:C# 如何从Azure Blob存储下载、解压缩和反序列化对象/文件?,c#,asp.net-mvc,azure-storage-blobs,C#,Asp.net Mvc,Azure Storage Blobs,此代码将压缩并序列化对象: public static byte[] ObjectToByteArray(object[] obj) { using (MemoryStream msCompressed = new MemoryStream()) using (GZipStream gZipStream = new GZipStream(msCompressed, CompressionMode.Compress))
public static byte[] ObjectToByteArray(object[] obj)
{
using (MemoryStream msCompressed = new MemoryStream())
using (GZipStream gZipStream = new GZipStream(msCompressed, CompressionMode.Compress))
using (MemoryStream msDecompressed = new MemoryStream())
{
new BinaryFormatter().Serialize(msDecompressed, obj);
byte[] byteArray = msDecompressed.ToArray();
gZipStream.Write(byteArray, 0, byteArray.Length);
gZipStream.Close();
return msCompressed.ToArray();
}
}
以下内容将上载到Azure Blob存储:
byte[] byteObject = ObjectToByteArray(uploadObject);
using (Stream stream = new MemoryStream(byteObject))
{
stream.Seek(0, SeekOrigin.Begin);
blockBlob.UploadFromStream(stream, null, options);
}
这非常有效,但我找不到从我的存储中下载、解压缩和反序列化此对象/文件的方法。您可以使用方法下载到流将文件下载到本地
using (var fileStream = System.IO.File.OpenWrite(@"xxxx\compressedfile.gz"))
{
blockBlob.DownloadToStream(fileStream);
}
然后您可以参考下面的代码来解压缩和反序列化指定的流
public static void DecompressAndDeserialize(string path)
{
using (FileStream originalFileStream = new FileStream(path, FileMode.Open, FileAccess.Read))
{
FileInfo fileToDecompress = new FileInfo(path);
string FileName = fileToDecompress.FullName;
string newFileName = FileName.Remove(FileName.Length - fileToDecompress.Extension.Length);
using (FileStream decompressedFileStream = File.Create(newFileName))
{
using (GZipStream decompressionStream = new GZipStream(originalFileStream, CompressionMode.Decompress))
{
decompressionStream.CopyTo(decompressedFileStream);
}
}
FileStream fs = new FileStream(newFileName, FileMode.Open);
BinaryFormatter formatter = new BinaryFormatter();
object[] uploadObject = (object[])formatter.Deserialize(fs);
}
}
您可以使用方法DownloadToStream将文件下载到本地
using (var fileStream = System.IO.File.OpenWrite(@"xxxx\compressedfile.gz"))
{
blockBlob.DownloadToStream(fileStream);
}
然后您可以参考下面的代码来解压缩和反序列化指定的流
public static void DecompressAndDeserialize(string path)
{
using (FileStream originalFileStream = new FileStream(path, FileMode.Open, FileAccess.Read))
{
FileInfo fileToDecompress = new FileInfo(path);
string FileName = fileToDecompress.FullName;
string newFileName = FileName.Remove(FileName.Length - fileToDecompress.Extension.Length);
using (FileStream decompressedFileStream = File.Create(newFileName))
{
using (GZipStream decompressionStream = new GZipStream(originalFileStream, CompressionMode.Decompress))
{
decompressionStream.CopyTo(decompressedFileStream);
}
}
FileStream fs = new FileStream(newFileName, FileMode.Open);
BinaryFormatter formatter = new BinaryFormatter();
object[] uploadObject = (object[])formatter.Deserialize(fs);
}
}
非常感谢您的光临!但它仍然给我一个错误:路径格式不受支持。当我使用此路径时:“https/:MYSTORAGEACC.blob.core.windows.net/MYCONTAINER/MYFILE”。我做错了什么?首先将文件从Azure Blob存储下载到本地,然后从本地解压并反序列化下载的文件,而不是将Blob url作为路径传递给方法DecompressAndDeserialize。非常感谢您的帮助!但它仍然给我一个错误:路径格式不受支持。当我使用此路径时:“https/:MYSTORAGEACC.blob.core.windows.net/MYCONTAINER/MYFILE”。我做错了什么?首先将文件从Azure Blob存储下载到本地,然后从本地解压缩并反序列化下载的文件,而不是将Blob url作为路径传递给方法DecompressAndDeserialize。