2015-12-09 2 views
0

Я пытаюсь использовать this pluggin (express-zip). В размере Azure Storage у нас есть getBlobToStream, которые дают нам файл в определенный поток. Теперь я получаю изображение из блоба и сохраняю его внутри сервера, а затем res.zip. Как-то можно создать writeStream, который будет писать внутри readStream?Windows Azure Storage Blobs для zip-файла с помощью Express

ответ

0

Я являюсь автором экспресс-почтового индекса. То, что вы пытаетесь сделать, должно быть возможным. Если смотреть под одеялом, вы будете видеть, что я на самом деле добавления потоков в zip:

https://github.com/thrackle/express-zip/blob/master/lib/express-zip.js#L55

Так что-то, как это должно работать для вас (до меня, добавив поддержку для этого в интерфейсе сам пакет):

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); 
    }); 
}); 

Извините, если я допустил ужасные ошибки выше; Я не был на это немного.

2

Редактировать: Вопрос был изменен, чтобы спросить об этом в экспресс из Node.js. Я оставляю оригинальный ответ ниже, если кто-то заинтересован в решении C#.

Для узла можно использовать стратегию, аналогичную используемой функцией express-zip, но вместо того, чтобы передавать поток чтения файла в this line, передайте поток чтения blob, полученный с помощью createReadStream.

Решение с использованием C#:

Если вы не возражаете кэширования все локально в то время как вы строите молнию, как вы делаете это хорошо. Вы можете использовать такой инструмент, как AzCopy, чтобы быстро загрузить весь контейнер из хранилища.

Чтобы избежать кэширования локально, можно использовать ZipArchive класс, например, следующий C# код:

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); 
        } 
       } 
      } 
     } 
    } 

Это создает архив почтового индекса в хранилище Azure, который содержит несколько сгустки без ничего писать на диск локально.

+0

Я забыл упомянуть, что я работаю над nodejs –

+0

Я отредактировал ответ, чтобы отразить новый вопрос, но я оставляю решение C# на случай, если кому-то это интересно. В принципе, @thrackle верен. Вы можете использовать ту же технику, что и express-zip, но использовать поток blob и имя blob вместо потока файлов и имени файла. –

Смежные вопросы