Узел Multipart (Многопартийность) S3 Upload
Я пытаюсь выполнить потоковую передачу файла при многоэтапной загрузке на S3 с использованием aws-sdk и multiparty.
multipartStream(key, req) {
const self = this;
return new Promise(function(resolve, reject) {
console.log(`Streaming key '${key}' to bucket '${self.s3Path}' `);
const form = new multiparty.Form();
const metadata = {};
form.on('field', (name, value) => {
metadata[name] = value;
});
form.on('part', (part) => {
part.on('error', (perr) => { reject(perr); });
part.on('data', (perr) => { /* console.log('Part data'); */ });
console.log(`part.byteCount: ${part.byteCount}`);
const upload = s3.upload({
Bucket: self.s3Path,
Key: key,
Metadata: metadata,
ContentLength: part.byteCount,
Body: part
//Body: fs.createReadStream('/Users/gc/Desktop/Music/Archive1.zip')
}, (err, data) => {
console.log('WHY OH WHY WONT YOU WORK');
if (err) return reject(err);
resolve(data);
})
.on('httpUploadProgress', (progress) => {
console.log(progress);
})
});
form.on('error', (err) => { return reject(err); });
form.parse(req);
});
}
Размер файла в соответствии с fs.stat
12973718.
Вывод, который я вижу из этой функции:
Streaming key 'test-id-1' to bucket 'e1c-testing-file-service'
part.byteCount: 12973936
{ loaded: 12973936, total: 12973936, part: 1, key: 'test-id-1' }
{ loaded: 12973936, total: 12973936, part: 1, key: 'test-id-1' }
{ loaded: 12973936, total: 12973936, part: 1, key: 'test-id-1' }
Проблема в том, что обратный вызов для функции s3.upload не вызывается, несмотря на результаты httpUploadProgress, но когда он, наконец, вызывается, он вызывается с ошибкой
Error: Request aborted
at IncomingMessage.onReqAborted (/Users/gcosta/Desktop/Team/eLect/file-service/node_modules/multiparty/index.js:183:17)
at emitNone (events.js:86:13)
at IncomingMessage.emit (events.js:185:7)
at abortIncoming (_http_server.js:281:11)
at Socket.serverSocketCloseListener (_http_server.js:294:5)
at emitOne (events.js:101:20)
at Socket.emit (events.js:188:7)
at TCP._handle.close [as _onclose] (net.js:497:12)
У меня есть ощущение, что это как-то связано с тем, что поток не был закрыт и / или ContentLength вызова загрузки S3. Потому что когда я использую Body: fs.createReadStream('/Users/gc/Desktop/Music/Archive1.zip')
линия и вынуть ContentLength
а также Body: part
линии это работает.
У кого-нибудь есть какие-либо идеи?