Azureのストレージ上にあるBLOBをzipして保存する方法

Azureで開発をしていて、BLOBをzip化したのですが、結構手こずったので覚書として残しておきます。
Azure SDK version 2.9.0
DotNetZip 1.10.1

基本的に、Azureストレージ上のBLOBは、ローカルのファイルのようにそのままzipファイルに圧縮することができません。
なので、一度ストリームに読み込んであげる必要があります。
以下、サンプルコード。

private void CreateZip()
{
// ストレージアカウントの生成。
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting(“StorageConnectionString”));

// BLOBクライアントの生成。
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

// BLOBのコンテナ取得。
CloudBlobContainer container = blobClient.GetContainerReference(“コンテナ名”);

// コンテナ上のファイルをBLOBに読み込む。複数ファイルをzip化したいなら、これ以降を繰り返す。
CloudBlob cloudBlob = container.GetBlobReference(“ファイル名”);

// BLOBを一度ストリームに取り込み、サイズを取得する(これをやらないと下でサイズがとれない)。
// ※BLOBをシークすればOKのようなので、これじゃなくてもいけるかも?
var memoryStream = new MemoryStream();
cloudBlob.DownloadToStream(memoryStream);
string text = System.Text.Encoding.UTF8.GetString(memoryStream.ToArray());

// データを読み込むバイト配列の初期化。
long fileByteLength = cloudBlob.Properties.Length;
byte[] fileBytes = new byte[fileByteLength];
// データをバイト配列に読み込む。
cloudBlob.DownloadToByteArray(fileBytes, 0);

// ZIPファイル作成(DotNetZip(Ionic Zip Library)を使用)。
Ionic.Zip.ZipFile zip = new Ionic.Zip.ZipFile();
zip.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression;
zip.AlternateEncoding = System.Text.Encoding.GetEncoding(“UTF-8”);
zip.AlternateEncodingUsage = Ionic.Zip.ZipOption.Always;
zip.Password = “パスワード”;
zip.Encryption = Ionic.Zip.EncryptionAlgorithm.WinZipAes256; //AES 256ビット暗号化。
// ↑この行を削除すれば、通常のzipファイルも可能。暗号化する場合は、パスワード必須。

// バイト配列をZIPに書き込む。
zip.AddEntry(“ファイル名”, fileBytes);
// ↑ここのファイル名でパス付にしたりできる。コンテナ内と同じ構造も可能。

// ストリームにZIPを書き込む。
using (var zipStream = new MemoryStream())
{
zip.Save(zipStream);
zipStream.Seek(0, SeekOrigin.Begin);

// ストリームにしたZIPファイルを、BLOBへ書き込み。
CloudBlockBlob blobRef = container.GetBlockBlobReference(“zipファイル名”);
blobRef.UploadFromStream(zipStream);
}
}

複数ファイルをzip圧縮したい場合は、読み込みー>書き込みを、ファイル数分繰り返してあげる必要があります。
ちなみに、.NET Framework 4.5 からは標準でzip圧縮が可能なのですが、
それだとAES暗号化が(確か)できないので、DotNetZipを使用しています。

ワークフロー業務基盤「じょうできmFIND」

じょうできmFINDはシンプルな構成で承認ワークフロー機能を有したローコード業務基盤です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です