上传到S3的MP3文件无法播放

时间:2019-04-28 12:51:27

标签: node.js amazon-s3 wechat

我有一个微信小程序,可以上传从微信自己的RecorderManager创建的MP3文件。

wx.uploadFile({
  url: `${config.serverBaseUrl}/audio_reviews`,
  filePath: this.data.audioFile,  
  name: 'file',
  formData: {
    user_id: currentUser.id,
    movie_id: movieId,
  },
  header: {
    'content-type': 'multipart/form-data'
  },
  success(res) {
    // success handler
  }
})

我的Node.js服务器使用koa-body允许多部分/表单数据上传。

const body = require('koa-body');
app.use(body({
  multipart: true,
  formidable: {
    keepExtensions: true,
  }
}));

上传音频文件端点将文件上传到AWS S3。

createAudio: async (ctx, next) => {
  const pg = new Client(config.pgConfig);
  await pg.connect();
  const body = ctx.request.body;
  const file = ctx.request.files.file;

  const s3 = new AWS.S3();

  const params = {
    Bucket: 'myS3Bucket',
    Body: fs.createReadStream(file.path),
    Key: file.path,
    ContentType: 'audio/mpeg',
  };

  s3.upload(params, (err, data) => {
    if (err) {
      console.error(err);
    };

    if (data) {
      // success handler
    };
  });
}

文件已上传到S3,但是当我下载文件时,没有声音。在将录音上传到服务器之前,我可以确认录音是否正确播放。我做错了什么?

1 个答案:

答案 0 :(得分:0)

我有一个类似的问题,使用请求模块下载文件并将fs.createWriteStream(file)传递到指定路径。我将“完成”侦听器设置为等待文件完全下载,然后在回调中处理上传。

files
.filter(file => file.length)
  .map(file => {
    let fileName = `${path.resolve()}/files/mp3/${getFilename(file)}`
    let filePath = fs.createWriteStream(fileName)

    let options = {
      method: "GET",
      url: file
    };
  if(!fs.existsSync(fileName)) {
      request(options).pipe(filePath) 
      filePath.on('finish', () => uploadFile(bucket, fileName))
     }
});

就像您的问题一样,将文件写入磁盘后,我的文件没问题,但是尝试从s3下载链接后,它将无法播放。事实证明,它是在完全下载之前写入s3的(因此s3中每个文件的大小均为0B)。