Узел 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 линии это работает.

У кого-нибудь есть какие-либо идеи?

0 ответов

Другие вопросы по тегам