Поток из браузера в API для S3 с файлом и метаданными в полезной нагрузке - PullRequest
0 голосов
/ 27 сентября 2018

В корне я пытаюсь сделать запрос, который течет из браузера, через API, в корзину S3.Полезная нагрузка содержит видео / изображение (большой файл) и некоторые связанные данные.

Как я могу использовать соответствующие данные в API, не анализируя всю полезную нагрузку (поскольку видео могут быть довольно большими), И ТОЛЬКО передатьвидео / изображение на S3?

// html react
const formData = new FormData();
formData.append('file', `${this.state.file}` );
formData.append('userId', 'bob1');
formData.append('filename', 'video.mp4');
formData.append('group', 'animals');
fetch('http://localhost:8282/file', {
    method: 'POST',
    mode: 'no-cors',
    body: formData
  })
  .catch(error => error);

и вот где я нахожусь с API в виде единого непрерывного потока

// hapi.js server
const server = Hapi.server({
  port: 8282,
  host: 'localhost'
});

server.route({
  method: 'POST',
  path: '/file',
  handler: (request, h) => {
    const params = {
        Body: request.payload,
        Bucket: 'bucket1',
        Key: `video_${uuid().mp4}`
      };
    const upload = new AWS.S3().upload(params);
    const promisedUpload = upload.promise();
    // 1) how do I get just the userId and group information from the payload here to save to a db?
    // 2) and how do I pipe the stream along to s3 without that userId and group information tagging along?
    return promisedUpload
      .then((response) => {
        return response;
      })
      .catch((error) => {
        return error;
      });
  },
  options : {
    payload: {
      allow: 'multipart/form-data',
      maxBytes: 204857600,
      output: 'stream',
      parse: false, // prevents putting a giant video upload into memory
      timeout: 20000
    }
  }
});

Вещи, которые я пробовал:

Я пытался создать свой собственный Transform Stream, но входящий поток - это все одно (буфер? Или кусок?) И не разделен на части.

class myTransform extends Transform {
  constructor() {
    super({ objectMode: true, highWaterMark: 1 });
  }

  _transform(chunk, encoding, callback) {
    if(chunk.metadata.fieldname === 'file'){
      callback(null, chunk.field);
    }
    else {
      callback(); // callback(null, null); ?
    }
  }
}

Я пытался использовать multiparty и busboy , но я думаю, что оба из них полагаются на то, что запрос был проанализирован Hapi.js потому что я не получаю никаких событий при использовании любого из них.: (

multipart-upload-stream выглядело несколько многообещающе, потому что я мог использовать запрос как объект и выбирать только ту часть, которая мне была нужна, но когда я пытался передать этоданные отправляются на S3, они заканчиваются как пустой файл. Я также не могу записать их на диск (тоже пустой файл).

Так что я немного растерялся, это поток такого типая пытаюсь сделать даже возможное? Пытаюсь ли я использовать потоки так, как они не предназначены для использования?

...