来自 URL 的文件大小与存储中的下载文件不同

Posted

技术标签:

【中文标题】来自 URL 的文件大小与存储中的下载文件不同【英文标题】:File size from URL not the same as download file in storage 【发布时间】:2017-02-01 21:01:12 【问题描述】:

我正在尝试使用 Asynctask 从 URL 下载文件。在 doInBackground() 方法中,我检索文件大小,如下所示。

    lenghtOfFile = conection.getContentLength();

这将返回一个整数值。现在,下载继续进行,文件已完全下载并写入 sdcard。

问题是在我的 postExecute() 中我想比较来自 URL 的文件的大小和下载的文件的大小。

    @Override
    protected void onPostExecute(String s) 
        super.onPostExecute(s);

        //check if the file was download and know how much of it
        //was downloaded, so as to update ui accordingly
        if(file.exists())

            Log.e("apiFileSize", String.valueOf(lenghtOfFile));
            Log.e("downloadFileSize", String.valueOf(file.length()));

            //check if the file was completely downloaded
            if(lenghtOfFile == file.length())
                     ....

如您所见,我记录了这两个值,但即使下载运行到最后并且文件已完全下载,它们也不相等。本地存储(sdcard)中的文件最终大于 url 中的文件大小。我希望他们是平等的,为什么会这样?我该怎么办?

以下是日志结果。

09-23 22:44:48.203  26594-26594/com.mobile.soullounge E/apiFileSize﹕ 1298573 
09-23 22:44:48.204  26594-26594/com.mobile.soullounge E/downloadedFileSize﹕ 2696392

提前致谢。

【问题讨论】:

下面的回答对你有用吗?如果愿意接受? 【参考方案1】:

我假设你使用的是HttpURLConnection

默认情况下,HttpURLConnection 的这个实现请求服务器使用 gzip 压缩,它会自动为getInputStream() 的调用者解压缩数据。因此getContentLength() 不能用于确定文件的大小。

但是!您可以像这样禁用压缩:

urlConnection.setRequestProperty("Accept-Encoding", "identity");

您的服务器也应该设置为正确处理这种情况。

【讨论】:

这是一些见解。我所做的是在我的 api 对象中添加一个文件大小属性。此大小是在创建对象时计算的。所以我现在可以在客户端访问它。

以上是关于来自 URL 的文件大小与存储中的下载文件不同的主要内容,如果未能解决你的问题,请参考以下文章

使用 Azure 函数从 Azure Blob 存储下载文件会返回不同的文件大小

在共享首选项中获取文件大小

多线程程序下载的文件顺序不是恒定的

为啥无法使用 Google Firebase 存储中的下载 URL 打开上传的文件?

从url下载pdf,在flutter中保存到android中的手机本地存储

从 s3 到 Redshift 的数据复制:清单与我需要下载的文件位于不同的存储桶中