Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Express将Windows Azure存储Blob压缩到zip文件_Express_Zip_Azure Storage - Fatal编程技术网

使用Express将Windows Azure存储Blob压缩到zip文件

使用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

我尝试使用Azure存储大小
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);
  });
});