Я использую 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), поэтому выражение правильно устанавливает заголовок, а размер загруженного файла соответствует тому, что я вижу при просмотре ведра.
Любые идеи, что происходит не так?