微信小程序录音文件上传后端显示文件已损坏

我在小程序中调用api录音,然后把录音文件上传到nodejs,成功后我想看一下录音文件,点开结果发现文件打不开
小程序代码:

// 结束录音
    voiceEnd(e){
        if(this.data.voiceShow != true) return
        const that = this
        recorderManager.stop()
        recorderManager.onStop(async (res) => {
            console.log('录音停止', res)
            // tempFilePath = res.tempFilePath  
            this.setData({
                tempFilePath:res.tempFilePath
            })
            innerAudioContext.src = res.tempFilePath    
            var uploadTask = wx.uploadFile({
                filePath: res.tempFilePath,
                name: 'voiceFile',                  
                url: 'http://localhost:3000/api/voice',
                header: {
                    "Content-Type": "multipart/form-data"
                },
                success:(e) => {
                    console.log('success',e);          
                },
                fail: (e) => {
                    console.log('fail',e);   
                }
                });
                uploadTask.onProgressUpdate((e) => {
                    console.log(e);
                    console.log('期望上传的总字节数:' + e.totalBytesExpectedToSend);
                    console.log('已经上传的字节数' + e.totalBytesSent);      
            })     
        })
    },

nodejs代码:

const express = require('express')
const ffmpeg = require('ffmpeg')
const router = express.Router()
const multer = require('multer')
// let upload = multer({ dest: 'routers/voiceup' })
// 处理上传文件时需要的数据
const { cutOutStr } = require('../utils/index')
const moment = require('moment')
let date = new Date()
let times = date.getTime()
let originalname;
let random = Math.floor(Math.random() * (1000 - 100 + 1)) + 100
let urlStr; 
let src = ''
let storage = multer.diskStorage({
    destination: function(req, file, cb) {
        cb(null, 'routers/voiceup'); 
    },
    filename: function(req, file, cb) {
        originalname = Buffer.from(file.originalname, "latin1").toString("utf8"); // 解决接收文件的文件名中文乱码问题
        urlStr = originalname
        times = date.getTime()
        random = Math.floor(Math.random() * (10000 - 100 + 1)) + 100
        src = 'http://localhost:3000/' + urlStr
        cb(null, urlStr)
    }
})
let upload = multer({ storage: storage });
router.post('/',upload.single('voiceFile'),(req,res) => {
    try {
        console.log('asssssssssssssssssssssss');
        console.log('received',req.file);
        // ffmpeg
        res.send({code:200,msg:'上传成功'})
    } catch(err) {
        console.log(err);
        res.status(500).send(err)
    }
})
module.exports = router

img

img

这是为什么啊?有没有大锅帮忙看一下

问题可能出在文件的上传和保存过程中。在您的代码中,文件上传和保存看起来没有问题,但您可能忽略了音频文件的格式转换问题。微信小程序录音生成的文件格式可能不是常见的音频格式,因此在保存之前,您可能需要将其转换为可用的音频格式。

在Node.js中,您可以使用"ffmpeg"库来进行音频格式转换。但在您的代码中,虽然导入了ffmpeg,但并没有实际进行音频格式转换的操作。

以下是在Node.js中使用ffmpeg库来转换音频格式的示例代码:

const express = require('express');
const router = express.Router();
const multer = require('multer');
const ffmpeg = require('fluent-ffmpeg'); // 使用 "fluent-ffmpeg" 替代 "ffmpeg"

const storage = multer.diskStorage({
  destination: function(req, file, cb) {
    cb(null, 'routers/voiceup');
  },
  filename: function(req, file, cb) {
    // 文件名的生成略去,与您现有代码相同
    // ...
    cb(null, urlStr);
  },
});

const upload = multer({ storage: storage });

router.post('/', upload.single('voiceFile'), (req, res) => {
  try {
    console.log('received', req.file);

    // 使用 "fluent-ffmpeg" 进行音频格式转换
    const inputFilePath = req.file.path;
    const outputFilePath = req.file.path + '.mp3'; // 转换为MP3格式,您可以根据需要更改为其他格式

    ffmpeg(inputFilePath)
      .toFormat('mp3')
      .on('end', () => {
        console.log('转换成功');
        res.send({ code: 200, msg: '上传成功' });
      })
      .on('error', (err) => {
        console.log('转换失败', err);
        res.status(500).send(err);
      })
      .save(outputFilePath);

    // 请注意:上述代码将音频文件转换为MP3格式,并保存到 outputFilePath 路径下。
    // 您可以根据需要进行其他格式的转换,或直接覆盖原始文件。

  } catch (err) {
    console.log(err);
    res.status(500).send(err);
  }
});

module.exports = router;

请确保在Node.js环境中安装了"fluent-ffmpeg"库,您可以通过在项目目录中运行以下命令进行安装:

npm install fluent-ffmpeg

上述代码将在保存音频文件之前使用fluent-ffmpeg将其转换为MP3格式。您可以根据需要修改为其他格式,例如AAC等。

在实际应用中,您可能还需要对上传的音频文件进行一些清理和管理,例如删除临时文件等,以确保系统资源得到有效利用。