使用Express将Windows Azure存储Blob压缩到zip文件
我尝试使用Azure存储大小使用Express将Windows Azure存储Blob压缩到zip文件,express,zip,azure-storage,Express,Zip,Azure Storage,我尝试使用Azure存储大小getBlobToStream,它将文件放入特定流中。我现在要做的是从blob中获取图像并将其保存在服务器中,然后res.zip。是否有可能创建writeStream,它将在readStream中写入?编辑:该问题已被编辑,以询问如何从Node.js在express中执行此操作。我在下面留下原始答案,以防有人对C#解决方案感兴趣 对于Node,您可以使用类似于expresszip所使用的策略,但不是传入文件读取流,而是传入使用createReadStream获得的bl
getBlobToStream
,它将文件放入特定流中。我现在要做的是从blob中获取图像并将其保存在服务器中,然后res.zip
。是否有可能创建writeStream,它将在readStream中写入?编辑:该问题已被编辑,以询问如何从Node.js在express中执行此操作。我在下面留下原始答案,以防有人对C#解决方案感兴趣
对于Node,您可以使用类似于expresszip所使用的策略,但不是传入文件读取流,而是传入使用createReadStream获得的blob读取流
使用C#的解决方案:
如果您不介意在构建zip时在本地缓存所有内容,那么您现在的方式就可以了。您可以使用诸如之类的工具从存储器中快速下载整个容器
为了避免本地缓存,您可以使用该类,例如以下C#代码:
内部静态void archiveBlob(CloudBlockBlob destinationBlob,IEnumerable SourceBlob)
{
使用(Stream blobWriteStream=destinationBlob.OpenWrite())
{
使用(ZipArchive存档=新ZipArchive(blobWriteStream,ZipArchiveMode.Create))
{
foreach(sourceBlob中的CloudBlob sourceBlob)
{
ZipArchiveEntry archiveEntry=archive.CreateEntry(sourceBlob.Name);
使用(Stream archiveWriteStream=archiveEntry.Open())
{
sourceBlob.DownloadToStream(archiveWriteStream);
}
}
}
}
}
这将在Azure存储中创建一个包含多个blob的zip存档,而无需在本地将任何内容写入磁盘。我是express zip的作者。你想做的应该是可能的。如果你看一下封面下面,你会发现我实际上是在向zip中添加流: 因此,类似的内容应该适合您(在我在包本身的接口中添加对此的支持之前):
如果我犯了上述可怕的错误,请道歉;我已经有一段时间没有讨论这个问题了。我已经编辑了答案以反映新问题,但我将保留C#解决方案,以防有人感兴趣。基本上,@strackle是正确的。您可以使用与express zip相同的技术,但使用blob流和blob名称,而不是文件流和文件名。
internal static void ArchiveBlobs(CloudBlockBlob destinationBlob, IEnumerable<CloudBlob> sourceBlobs)
{
using (Stream blobWriteStream = destinationBlob.OpenWrite())
{
using (ZipArchive archive = new ZipArchive(blobWriteStream, ZipArchiveMode.Create))
{
foreach (CloudBlob sourceBlob in sourceBlobs)
{
ZipArchiveEntry archiveEntry = archive.CreateEntry(sourceBlob.Name);
using (Stream archiveWriteStream = archiveEntry.Open())
{
sourceBlob.DownloadToStream(archiveWriteStream);
}
}
}
}
}
var zip = zipstream(exports.options);
zip.pipe(express.response || http.ServerResponse.prototype); // res is a writable stream
var addFile = function(file, cb) {
zip.entry(getBlobToStream(), { name: file.name }, cb);
};
async.forEachSeries(files, addFile, function(err) {
if (err) return cb(err);
zip.finalize(function(bytesZipped) {
cb(null, bytesZipped);
});
});