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

Android下载DigitalOcean Spaces MP3返回400报FileNotFoundException

问题原因
  • 故障根源是下载代码中错误配置了urlConnection.setDoOutput(true);。
    安卓原生HttpsURLConnection底层基于OkHttp实现,只要设置setDoOutput(true),就代表本次请求需要向服务端写入请求体,框架会自动将请求方法从GET改写为POST。
  • 原服务商Hostinger对HTTP请求方法校验宽松,即使收到指向静态MP3资源的POST请求,也会正常返回文件内容,因此旧链路下载功能正常。
  • Digital Ocean Spaces是兼容S3协议的对象存储服务,对HTTP规范的执行更严格:公开静态资源仅接受GET、HEAD类请求,收到POST请求会直接返回400 Bad Request状态码。当响应状态码为4xx/5xx时,直接调用getInputStream()就会抛出你遇到的FileNotFoundException。
  • 浏览器、MediaPlayer播放功能正常的原因也很简单:这两个场景发起的都是标准GET请求,没有配置请求体输出,完全符合Spaces的请求规则。
解决方法
  • 直接删除代码中urlConnection.setDoOutput(true);这行即可。GET请求的作用是从服务端拉取资源,不需要向服务端发送请求体,无需开启输出流配置。
  • 建议补充响应状态码判断逻辑,避免后续排查问题困难:当返回非2xx状态码时,不要直接调用getInputStream(),可以通过getErrorStream()读取服务端返回的错误信息,参考调整片段:
urlConnection.connect();
int responseCode = urlConnection.getResponseCode();
Log.i("download:", "Code: " + responseCode);
InputStream inputStream;
if (responseCode >= 200 && responseCode < 300) {
    inputStream = urlConnection.getInputStream();
} else {
    // 非成功状态读取错误流打印日志,后续走异常处理逻辑
    inputStream = urlConnection.getErrorStream();
    throw new IOException("Request failed, code: " + responseCode);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 17:06:57