为何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
相关产品推荐
相关产品推荐

