2016-04-05 7 views
1

Это может быть невозможно, но я пытаюсь вернуть буферный объект изображения на Rackspace с помощью модуля pkgcloud без необходимости записи в файловую систему. Я видел это раньше, но оба примера показывают, как загрузить загрузку в файловую систему.Получить буфер из Rackspace скачать с помощью pkgcloud

function get() { 
     return new Promise(function (resolve, reject) { 
      _this._RackClient.download(options, function(err, results) { 
       if (err !== null) { 
        return reject(err); 
        console.log("Errow Downloading:", err); 
       } 
       resolve(buffer); 
      }); 
     }); 
    } 
    return get(); 

Это идеально, как я хотел бы, чтобы работать, но там в настоящее время не является органом присутствует в запросе. Могу ли я использовать stream.passThrough() и вернуть то же, что и при загрузке буфера?

ответ

1

.download() возвращает читаемый поток, поэтому он должен быть просто буферизацией этого вывода. Например:

var stream = _this._RackClient.download(options); 
var buf = []; 
var nb = 0; 
var hadErr = false; 
stream.on('data', function(chunk) { 
    buf.push(chunk); 
    nb += chunk.length; 
}).on('end', function() { 
    if (hadErr) 
    return; 
    switch (buf.length) { 
    case 0: 
     return resolve(new Buffer(0)); 
    case 1: 
     return resolve(buf[0]); 
    default: 
     return resolve(Buffer.concat(buf, nb)); 
    } 
}).on('error', function(err) { 
    hadErr = true; 
    reject(err); 
}); 
+0

Это сработало отлично! Спасибо за ответ! – mcclaskiem

+0

это работало с получением данных правильно, но им любопытно, что оператор switch обрабатывает, поскольку он не кажется правильным буфером. @mscdex – mcclaskiem

+0

Что вы подразумеваете под «правильным буфером?» 'buf' просто хранит куски, когда они входят, а' switch' - всего лишь небольшая оптимизация, чтобы избежать вызова 'Buffer.concat()' если это необходимо. – mscdex