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

