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

问题描述 投票:0回答:1

我有一个微信小程序,可以上传从微信自己的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,但是当我下载该文件时,没有声音。在将录音上传到服务器之前,我可以确认录音是否正确播放。我做错了什么?

node.js amazon-s3 wechat
1个回答
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)。

© www.soinside.com 2019 - 2024. All rights reserved.