You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native上传音频至NestJS仅传元数据,文件内容为空Buffer

React Native 录制音频上传至 NestJS 服务端时文件内容为空(Buffer 大小为0)

我使用 React Native 客户端和 NestJS 服务端开发录制音频并上传的功能,该 API 端点在 Postman 和 React 网页端测试均正常,但通过 React Native 上传文件时,服务端仅能收到文件元数据,文件内容为 size 为 0 的空 Buffer。在 stopRecording 处理函数中,已确认发送请求前 formData 确实包含音频文件内容。

React Native 组件代码

const AudioInput3 = () => {
  const [recording, setRecording] = useState<Recording | null>(null);
  const [recordingStatus, setRecordingStatus] = useState("idle");
  const [audioPermission, setAudioPermission] = useState(false);

  const startRecording = async () => {
    try {
      if (audioPermission) {
        await Audio.setAudioModeAsync({
          allowsRecordingIOS: true,
          playsInSilentModeIOS: true,
        });
      }

      const newRecording = new Audio.Recording();
      await newRecording.prepareToRecordAsync(
        Audio.RecordingOptionsPresets.HIGH
      );
      await newRecording.startAsync();

      setRecording(newRecording);
      setRecordingStatus("recording");
    } catch (err) {
      console.error("Failed to start recording", err);
    }
  };


  async function stopRecording() {
    try {
      if (!recording) return;
      if (recordingStatus === "recording") {
        await recording.stopAndUnloadAsync();
        const recordingUri = recording.getURI() as string;

        const filename = `recording_${Date.now()}.caf`;

        const filePath = FileSystem.documentDirectory + "recordings/";

        setRecording(null);
        setRecordingStatus("stopped");

        const fileData = await FileSystem.readAsStringAsync(recordingUri, {
          encoding: FileSystem.EncodingType.Base64,
        });

        const blob = new Blob([fileData], { type: "audio/x-caf" });
        const file = new File([blob], filename, {
          type: "audio/x-caf",
        });

        const fileSize = file.size;
        const formData = new FormData();
        formData.append("file", file);
        const response = await fetch(urlResolver.uploadToStorage(), {
          method: "POST",
          body: formData,
          headers: {
            "Content-Type": "multipart/form-data",
            "Content-Length": String(fileSize),
          },
        });
      }
    } catch (error) {
      console.error(error);
    }
  }
}

已尝试的解决方案

  • 移除请求头,无效;
  • 用 axios 替换 fetch,无效;
  • 关闭 react-native-debugger,无效。

NestJS API 端点代码

@Post("upload")
@UseInterceptors(FileInterceptor("file"))
uploadFile(@UploadedFile() file: Express.Multer.File) {
  console.log(file); 
}

服务端返回结果(空 Buffer)

{
  fieldname: 'file',
  originalname: 'recording_1683615927273.caf',
  encoding: '7bit',
  mimetype: 'audio/x-caf',
  buffer: <Buffer >,
  size: 0
}

内容的提问来源于stack exchange,提问作者Kittichote Chain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 10:13:32