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

如何从URL获取.wav文件Blob以实现同站音频跨Schema复制?

解决从同站URL获取WAV文件Blob并上传的问题

错误原因

你遇到的报错是因为fetch()返回的是一个Promise对象,而非直接的Blob实例。直接将这个Promise传给FormData.append()时,方法会因为参数类型不匹配而抛出错误。

解决方法

需要等待fetch的异步操作完成,拿到真实的Blob后再构建FormData并上传。以下提供两种可行的实现方式:

方式1:使用async/await(推荐,代码更易读)

async function copyAudioFiles() {
  // 用for...of替代forEach,支持异步顺序执行
  for (const item of newwavfiles) {
    const filename = item["filename"];
    
    // 等待fetch请求完成,获取Blob
    const res = await fetch('https://mywebsite.nl/media/audiofiles/12345677/recording.wav');
    // 检查请求是否成功
    if (!res.ok) {
      console.error(`获取音频失败: ${res.status}`);
      continue;
    }
    const fileBlob = await res.blob();

    // 构建FormData
    const formData = new FormData();
    formData.append('file', fileBlob, filename);
    formData.append('guid', guid);

    // 上传文件
    try {
      const response = await $.ajax({
        url: 'index.php?action=uploadAudiofile',
        type: 'post',
        data: formData,
        enctype: 'multipart/form-data',
        contentType: false,
        processData: false
      });
      console.log(`音频 ${filename} 复制成功`, response);
    } catch (xhr) {
      const errorMsg = `${xhr.status}: ${xhr.statusText}`;
      console.error(`音频 ${filename} 复制失败`, errorMsg);
    }
  }
}

// 执行复制操作
copyAudioFiles();

方式2:使用Promise链式调用

newwavfiles.forEach(item => {
  const filename = item["filename"];

  fetch('https://mywebsite.nl/media/audiofiles/12345677/recording.wav')
    .then(res => {
      if (!res.ok) throw new Error(`请求失败: ${res.status}`);
      return res.blob();
    })
    .then(fileBlob => {
      const formData = new FormData();
      formData.append('file', fileBlob, filename);
      formData.append('guid', guid);
      
      return $.ajax({
        url: 'index.php?action=uploadAudiofile',
        type: 'post',
        data: formData,
        enctype: 'multipart/form-data',
        contentType: false,
        processData: false
      });
    })
    .then(response => {
      console.log(`音频 ${filename} 复制成功`, response);
    })
    .catch(error => {
      console.error(`音频 ${filename} 复制失败`, error.message || `${error.status}: ${error.statusText}`);
    });
});

关键注意点

  • 异步等待:必须确保fetch完成并拿到Blob后,再执行FormData构建和上传操作
  • 状态检查:添加res.ok判断,避免处理失败的HTTP响应(比如404、500错误)
  • 并发控制:如果需要控制上传顺序,推荐使用for...of+async/await;如果允许并发上传,forEach+Promise链式调用也可,但需注意服务器压力

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 08:50:38