2015-11-04 2 views
1

Я использую knox для доступа к ведро Amazon S3 для хранения файлов. Я храню все виды файлов - в основном MS Office и pdf, но может быть двоичным или любым другим. Я также использую express 4.13.3 и busboy с connect-busboy для потоковой поддержки; при загрузке файла я обрабатываю с помощью busboy и оттуда прямо на S3 через knox, поэтому избегаю сначала записывать их на локальный диск.Файлы, загруженные с Amazon S3 с использованием Knox и Node.js, повреждены

Загрузка файлов в порядке (я могу просматривать и загружать их вручную, используя Transmit), но у меня проблемы с загрузкой.

Для ясности я не хочу писать файл на локальный диск, вместо этого сохраняя его в буфере памяти. Вот код, я использую для обработки запроса GET:

// instantiate a knox object 
var s3client = knox.createClient({ 
    key: config.AWS.knox.key, 
    secret: config.AWS.knox.secret, 
    bucket: config.AWS.knox.bucket, 
    region: config.AWS.region 
}); 

var buffer = undefined; 

s3client.get(path+'/'+fileName) 
.on('response', function(s3res){ 

    s3res.setEncoding('binary'); 

    s3res.on('data', function(chunk){ 
    buffer += chunk; 
    }); 

    s3res.on('end', function() { 
    buffer = new Buffer(buffer, 'binary'); 
    var fileLength = buffer.length; 
    res.attachment(fileName); 
    res.append('Set-Cookie', 'fileDownload=true; path=/'); 
    res.append('Content-Length', fileLength); 
    res.status(s3res.statusCode).send(buffer); 
    }); 

}).end(); 

Файл загрузки в браузер - я использую John Culviner-х jquery.fileDownload.js - но то, что загружается поврежден и не может быть открыт. Как вы видите, я использую express '.attachment, чтобы установить заголовки для типа mime и .append для дополнительных заголовков (с использованием .set вместо этого не имеет значения).

Когда файл загружается в Chrome, я вижу сообщение «Resource interpreted as Document but transferred with MIME type application/vnd.openxmlformats-officedocument.spreadsheetml.sheet:» (для файла Excel), поэтому выражение правильно устанавливает заголовок, а размер загруженного файла соответствует тому, что я вижу при просмотре ведра.

Любые идеи, что происходит не так?

ответ

0

Похоже, что содержимое не может быть отправлено в браузер как двоичный файл. Попробуйте что-то вроде следующего:

if (s3Res.headers['content-type']) { 
    res.type(s3Res.headers['content-type']); 
} 
res.attachment(fileName); 

s3Res.setEncoding('binary'); 
s3Res.on('data', function(data){ 
    res.write(data, 'binary'); 
}); 

s3Res.on('end', function() { 
    res.send(); 
}); 

Он также будет посылать данные один кусок в то время, как она приходит, поэтому она должна быть немного меньше памяти.

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