学而实习之 不亦乐乎

Android 中 HttpURLConnection.getContentLength() 返回值为-1

2022-11-16 20:36:46

环境: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"); 

但对于我的问题,设置后并没有解决问题。配置服务器上相应的压缩方式,确实有一些变化(可以获取到值,但与文件大小不一致,可能是压缩的缘故),但还是解决不了问题,这里记录下来,以后遇到再来补充。