我有两个独立的工作者角色:
WR1-将给定的文件(pdf)存储在blob存储上的特定容器中,代码如下:
var folderName = dynamicFolderNameAsInputToThisMethod;
CloudBlobContainer container;
container = GetCloudBlobContainerByName(containerName);
var blob = container.GetBlockBlobReference(string.Format("{0}/{1}", folderName, fileName));
blob.Properties.ContentType = inThisInstanceApplicationPdf;
await blob.UploadFromByteArrayAsync(storageBlob.FileAsByteArray, 0, storageBlob.FileAsByteArray.Length);
return string.Format("{0}/{1}/{2}", _blobClient.BaseUri, folderName, fileName);
这样可以毫无问题地保存文件。
第二个辅助角色将文件从中提取为字节数组,对其进行压缩并保存回blob存储区上的另一个"文件夹"。这就是我获取字节数组的方式:
var filesInContainer = new List<byte[]>();
var blobContainer = GetCloudBlobContainerByName(fileProcessStage);
var blobDirectory = blobContainer.ListBlobs(
string.Format("{0}/{1}", folderName, subFolderName))
.FirstOrDefault(b => b is CloudBlobDirectory) as CloudBlobDirectory;
foreach (var blob in blobDirectory.ListBlobs())
{
var blockBlob = blob as CloudBlockBlob;
byte[] fileContent = new byte[blockBlob.Properties.Length];
blockBlob.DownloadToByteArray(fileContent, 0);
filesInContainer.Add(fileContent);
}
return filesInContainer;
假设:提取时,文件夹中总是有一个文件。
然后使用Gzip:压缩
public byte[] Compress(byte[] bytesToCompress)
{
using(var originalStream = new MemoryStream(bytesToCompress))
{
using(var compressedFileStream = new MemoryStream())
{
using (var compressionStream = new GZipStream(compressedFileStream, CompressionMode.Compress))
{
originalStream.CopyTo(compressionStream);
}
return compressedFileStream.ToArray();
}
}
}
将上述方法返回的字节数组作为"filename.gz"文件保存到另一个blob容器。
然而,当gz文件被下载并解压缩时,它里面的文件没有扩展名,用户必须重命名文件并给它一个.pdf。然后文件就会显示出来。
我无法弄清楚在这个过程中,文件的扩展名是在哪里丢失的。
gzip不就是一个没有文件概念的字节压缩吗?我确信您需要将输出命名为filename.ext.gz
,这样当您解压缩它时,就会得到filename.ext
。
(未压缩的文件,名称相同,减号.gz)