Android 中 HttpURLConnection.getContentLength() 返回值为-1
环境:Android 11
一、问题及解决办法
在 Android 中根据 Sqlite 数据库文件的大小判断是否需要更新,但在使用 HttpURLConnection.getContentLength() 时返回值为-1,因此无法准确地判断文件的大小。
在浏览器中打开开发者工具(也就是快捷键 F12) ,经过调试发现,HttpURLConnection 会将其 Content-type 识别为 "text/html; charset=utf-8",可以看到请求头中并没有 content-length 这个字段,所以会返回 -1。
既然识别的 Content-type 有问题,如果将服务器上数据库文件的后缀名改为 .db.jpeg 后,Content-type 识别为 "image/jpeg",HttpURLConnection.getContentLength() 返回的文件大小正确。因此可以确定是 HTTP 访问时 MIME 识别错误导致的问题。
最终解决办法:修改 nginx 服务中的 mime.types 文件,添加 mime ,如下:
application/vnd.sqlite3 db;
在服务器上 reload Nginx 服务后,可以看到 Content-type 已变成 "application/vnd.sqlite3", 此时也可以正常识别文件的大小了。
二、相关问题
网络上大部分讲到的是 gzip 压缩的问题,解决办法是在请求头上添加如下信息:
connection.setRequestProperty("Accept-Encoding", "identity");
但对于我的问题,设置后并没有解决问题。配置服务器上相应的压缩方式,确实有一些变化(可以获取到值,但与文件大小不一致,可能是压缩的缘故),但还是解决不了问题,这里记录下来,以后遇到再来补充。