使用有效负载中的文件和元数据从浏览器流到API到S3

时间:2018-09-26 21:28:03

标签: amazon-s3 multipartform-data hapijs node-streams

从根本上讲,我正在尝试发出一个请求,该请求从浏览器通过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); ?
    }
  }
}

我尝试使用multipartybusboy,但是我认为这两个都依赖于Hapi.js解析请求,因为当我使用其中任何一个时都不会触发任何事件他们。 :(

multipart-upload-stream看起来有些许希望,因为我能够像使用对象一样使用请求并仅选择所需的部分,但是当我尝试将数据传输到S3上载时,最终结果是一个空文件。我也无法将其流式写入磁盘(也是一个空文件)。

所以我有点迷茫,我是否正在尝试这种类型的分流?我是否要以一种并非旨在使用的方式使用流?

0 个答案:

没有答案