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

如何实例化MP3音频文件对象以替代现有文件读取代码?

问题描述

我原本通过文件选择器获取文件并使用FileReader读取的代码可以正常运行:

<input type="file" id="my_file">

<script>
var file = document.getElementById('my_file').files[0],
reader = new FileReader();
reader.onload = function(e) {
//...
}
reader.readAsArrayBuffer(file);
</script>

但我希望直接实例化对象处理本地MP3音频文件,尝试以下代码后无法正常运行:

<script>
// 示例:尝试直接传入文件对象给readAsArrayBuffer()
var file = new File("./fichier.mp3");       // 无法工作

reader = new FileReader();
reader.onload = function(e) {
//...
}
reader.readAsArrayBuffer(file);
</script>

求可行解决方案。

解决方案

1. 从服务器加载音频(通用前端方案)

浏览器出于安全限制,禁止前端直接通过本地路径(如./fichier.mp3)访问文件系统,所以new File()传入路径的写法不成立。你可以用fetch API从服务器请求音频文件,直接获取ArrayBuffer:

fetch('./fichier.mp3')
  .then(response => response.arrayBuffer())
  .then(buffer => {
    // 在此处理获取到的音频ArrayBuffer
    console.log('音频数据已加载:', buffer);
    // 若需要转为File对象(可选)
    const audioFile = new File([buffer], 'fichier.mp3', { type: 'audio/mpeg' });
    // 后续可使用FileReader处理该File对象,或直接使用buffer
  })
  .catch(err => {
    console.error('音频加载失败:', err);
  });

2. 正确使用File构造函数

File构造函数的第一个参数必须是二进制数据的数组(比如Blob、ArrayBuffer),而非文件路径。如果已有音频的二进制数据,可这样创建File对象:

// 先通过fetch获取Blob格式的音频数据
fetch('./fichier.mp3')
  .then(res => res.blob())
  .then(blob => {
    const audioFile = new File([blob], 'fichier.mp3', { type: 'audio/mpeg' });
    const reader = new FileReader();
    reader.onload = function(e) {
      const buffer = e.target.result;
      // 处理音频数据
    };
    reader.readAsArrayBuffer(audioFile);
  });

3. 本地文件访问(特殊场景)

如果是浏览器扩展开发,或通过file://协议打开本地HTML(不推荐,存在安全限制),需通过浏览器提供的特定API获取文件权限,仍无法直接通过硬编码路径读取文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 09:49:17