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

为何reqwest将MP3二进制文件下载为文本?如何获取真实MP3?

解决GET请求获取MP3文件乱码的问题

你遇到的乱码和LAME加密无关,核心原因是错误地把二进制MP3数据当成UTF-8文本处理。MP3是二进制文件,不是可读文本,用text()方法强制将字节解码为字符串,必然导致乱码。

修正方案

修改代码,直接获取原始二进制数据并保存为MP3文件:

#[tokio::main]
async fn get_mp3(url: &str, client: &reqwest::Client) -> Vec<u8> {
    // 获取响应的原始二进制字节,跳过文本解码
    let response = client
        .get(url)
        .send()
        .await
        .unwrap()
        .bytes()
        .await
        .expect("GET请求失败");

    response.to_vec()
}

fn main() {
    let client = reqwest::Client::new();
    let url = "https://dl251.filemate24.shop/?file=M3R4SUNiN3JsOHJ6WWRQNXNPUFN2cFdxRVJIOGhmSXBsY1l1d2hrdFN1QnRxNGc5M3UraGFPWkpLSzRNeEl1dVd1aGQ4VHZYVG9uZE93MlpwZFlyVWlESDhkOHh2QURmOHBvb0JJd2pjQS8zanZLMmxEUXoyeUg0Ym91SVI1NE9LQ1Zka1ZJNzN5eWh5L0wrbHpqSDZpdW1wVjJRSWlrYTRYME1PUHFOeEt3TzBISGJadVhoeDVrSXFIdk90Y29maTZYTDVWYWdoYUE3dnVOMlZrRjNlTTBNbjRuamd2VE8vQT09";
    
    // 等待异步请求完成,获取二进制数据
    let mp3_data = get_mp3(url, &client);
    
    // 将二进制数据写入MP3文件
    std::fs::write("rammstein.mp3", mp3_data).expect("写入文件失败");
}

修改说明

  • 返回类型改为Vec<u8>:Vec<u8>是Rust存储二进制数据的标准类型,完美适配MP3这类非文本文件。
  • 用bytes()替代text():直接获取响应的原始字节流,避免文本解码导致的乱码。
  • 保存为.mp3后缀:确保系统正确识别文件类型,同时避免文本编辑器打开时的乱码显示。
  • 修复异步调用问题:原代码直接调用异步函数会报错,本示例通过#[tokio::main]正确处理异步逻辑的执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 15:50:57