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

如何在C#控制器中从Blob URL获取浏览器麦克风音频文件?

嘿,这个问题我太懂了!其实你可能踩了个常见小坑——Blob URL是浏览器本地生成的临时地址,后端根本没法直接访问它,因为它只在当前浏览器会话里有效,对外网/服务器来说完全是“看不见”的。所以正确的做法是前端把Blob本身的二进制数据发送给C#控制器,而不是只传那个URL。下面给你一步步拆解怎么做:

第一步:修改前端发送逻辑(传Blob数据而非URL)

原来你可能是把Blob URL字符串发给后端,现在改成把Blob包装成FormData发送,这样后端能直接拿到完整的音频文件:

// 假设你已经通过麦克风采集到了audioBlob这个音频Blob对象
const formData = new FormData();
// 把Blob添加到FormData,指定文件名和对应MIME类型(格式根据你的采集类型来,比如webm/wav/mp3)
formData.append("audioFile", audioBlob, "recorded-audio.webm");

// 用fetch发送到后端接口
fetch("/api/Audio/Upload", {
  method: "POST",
  body: formData
})
.then(response => response.json())
.catch(err => console.error("上传出错啦:", err));

如果习惯用axios,代码是这样的:

axios.post("/api/Audio/Upload", formData, {
  headers: {
    "Content-Type": "multipart/form-data"
  }
})
.then(res => console.log("上传成功!", res.data))
.catch(err => console.error("上传失败:", err));
第二步:C#控制器接收并处理音频文件

下面分两种常见的ASP.NET场景给你示例代码:

ASP.NET Core 版本

[ApiController]
[Route("api/[controller]")]
public class AudioController : ControllerBase
{
    private readonly IWebHostEnvironment _webHostEnv;

    // 注入IWebHostEnvironment用来获取服务器文件路径
    public AudioController(IWebHostEnvironment webHostEnv)
    {
        _webHostEnv = webHostEnv;
    }

    [HttpPost("Upload")]
    public async Task<IActionResult> UploadAudio(IFormFile audioFile)
    {
        // 先判断有没有收到文件
        if (audioFile == null || audioFile.Length == 0)
        {
            return BadRequest("没有接收到音频文件哦");
        }

        // 可选:验证文件格式,避免非法上传
        var allowedExtensions = new[] { ".webm", ".wav", ".mp3" };
        var fileExt = Path.GetExtension(audioFile.FileName).ToLower();
        if (!allowedExtensions.Contains(fileExt))
        {
            return BadRequest("只支持webm/wav/mp3格式的音频哦");
        }

        // 方案1:把音频保存到服务器本地
        var uploadsFolder = Path.Combine(_webHostEnv.WebRootPath, "audio-uploads");
        if (!Directory.Exists(uploadsFolder))
        {
            Directory.CreateDirectory(uploadsFolder);
        }
        // 用Guid生成唯一文件名,避免重复
        var uniqueFileName = Guid.NewGuid() + fileExt;
        var savePath = Path.Combine(uploadsFolder, uniqueFileName);
        using (var stream = new FileStream(savePath, FileMode.Create))
        {
            await audioFile.CopyToAsync(stream);
        }

        // 方案2:直接读取音频的字节数据(如果不需要存到本地,比如要转码/存数据库)
        using (var memoryStream = new MemoryStream())
        {
            await audioFile.CopyToAsync(memoryStream);
            byte[] audioBytes = memoryStream.ToArray();
            // 这里可以对audioBytes做你需要的处理,比如转格式、存入数据库等
        }

        return Ok(new { Message = "音频上传成功!", SavedFilePath = savePath });
    }
}

ASP.NET MVC(非Core)版本

[HttpPost]
public ActionResult UploadAudio(HttpPostedFileBase audioFile)
{
    if (audioFile == null || audioFile.ContentLength == 0)
    {
        return Json(new { success = false, message = "没有接收到音频文件" });
    }

    // 创建上传目录
    var uploadsFolder = Server.MapPath("~/audio-uploads");
    if (!Directory.Exists(uploadsFolder))
    {
        Directory.CreateDirectory(uploadsFolder);
    }

    // 保存文件
    var uniqueFileName = Guid.NewGuid() + Path.GetExtension(audioFile.FileName);
    var savePath = Path.Combine(uploadsFolder, uniqueFileName);
    audioFile.SaveAs(savePath);

    return Json(new { success = true, savedFilePath = savePath });
}
补个小知识点:为啥不能直接用Blob URL?

Blob URL(比如blob:http://localhost:5000/xxxx-xxxx)是浏览器为本地Blob对象生成的临时引用,它只在当前浏览器的会话中有效,而且只能由创建它的浏览器页面访问。服务器端的C#代码运行在独立的服务器环境里,完全没法解析这个URL拿到实际的音频数据,所以必须把Blob的二进制内容直接发给后端才行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:03:51