Ubuntu下使用Lua从URL下载MP3生成空文件的技术问题
解决Lua下载MP3文件为空的问题
嘿,我一眼就看出问题所在了——你现在只是把MP3的URL字符串直接写入了文件,而没有真正去下载这个URL对应的音频内容!这就是为什么生成的test.mp3是空的(或者打开后其实是一串网址文本)。
问题根源
你的代码里,voice.result.Voice_link返回的是音频文件的在线地址,比如类似https://xxx.com/yyy.mp3这样的字符串,而不是MP3文件的二进制数据。直接把这个字符串写入文件,自然得不到有效的音频文件。
修正后的解决方案
你需要再次发起HTTP请求,获取Voice_link对应的二进制内容,然后以二进制写入模式保存到文件中。假设你用的是Lua的luasec库提供的HTTPS.request(和原代码一致),修正后的完整代码如下:
local sound = HTTPS.request('https://hozory.com/translate/?target='..matches[1]..'&text='..text) local voice = json:decode(sound) if voice.result.Voice_link ~= "false" then -- 发起请求获取MP3的二进制内容 local mp3_content, status_code = HTTPS.request(voice.result.Voice_link) if status_code == 200 and mp3_content then -- 以二进制写入模式打开文件(必须用'wb'而非'w') local f = assert(io.open('test.mp3', 'wb')) f:write(mp3_content) f:close() print("MP3文件下载保存成功!") else print("下载MP3失败,状态码:"..tostring(status_code)) end else print("没有获取到有效的音频链接") end
关键注意点
- 用
'wb'模式写文件:Lua中'w'是文本模式,写入二进制音频时必须用'wb',否则会因为换行符转换等问题损坏文件。 - 增加请求状态校验:通过
status_code == 200确认HTTP请求成功,避免把错误响应写入文件。 - 保留错误处理:
assert可以捕获文件打开失败的情况,同时处理HTTP请求返回空内容的场景。
额外提示
如果你的Ubuntu环境还没安装luasec库(提供HTTPS请求能力),先执行以下命令安装:
sudo apt-get install lua-sec
同时确保当前用户对目标文件夹有写入权限,否则会出现文件无法创建的错误。
内容的提问来源于stack exchange,提问作者Shafiq Sadat
相关产品推荐
相关产品推荐

