下载getcontentlength()时会在Android中返回-1

时间:2014-05-30 12:10:32

标签: java android web-services web-applications download

我正在开发Android应用,我正在下载文件并在进度条中显示进度。为此,我需要知道文件的长度。所以我使用下面提到的代码。但它返回-1。本地服务器工作正常。但是一旦它转移到实时服务器,问题就开始了。所以任何人都可以帮助我。

URL url = new URL("URL TO DOWNLOAD");
URLConnection conection = url.openConnection();
HttpURLConnection httpUrlConn = (HttpURLConnection) conection;
httpUrlConn.connect();
int fileLength = connection.getContentLength();

这里我的文件长度为-1。为什么会这样?有没有办法避免它并获得正确的长度?

3 个答案:

答案 0 :(得分:0)

检查您的网址路径页面我认为该网页上没有任何数据。

答案 1 :(得分:0)

请阅读此内容。documentation

getContentLength()返回content-length头字段的值。

此连接的URL引用的资源的内容长度,如果内容长度未知,则为-1。

答案 2 :(得分:0)

绝对一样的事情也一直发生在我身上。这-1真的搞砸了我们的进度条,不是吗?你知道我在做什么吗?我重命名该文件(是的,在服务器上),然后将其更改回来。问题消失了。纯粹的魔法......此外,还有一个变通方法,快速而又脏兮兮的:如果您知道违规文件的精确长度,您只需用该数字替换-1即可。是的,只需替换它。例如,我的应用程序从我的个人网站下载文件,因此我100%确定文件已到位。我也知道他们的大小到一个字节。因此:

    @Override
    protected String doInBackground(String... aurl) {
        int realLOF = 1234567890;     // personally, I use an array element here 
        boolean badLOF = false;
        try {
             URL url = new URL(aurl[0]);
             URLConnection connection = url.openConnection();
             connection.connect();

             int lengthOfFile = connection.getContentLength();
             if (lengthOfFile == -1) {
             lengthOfFile = realLOF;             // yeah, I know. Unhealthy :(
             badLOF = true;                  
            }
             Log.d("DL", "LOF: " + lengthOfFile + ", badLOF: " + badLOF);

        // your DL logic here

               } catch (Exception e) {
        // whatever
               }
            return null;
        }
    // my app runs batch downloads so I made a recursive loop:
    // DownloadFileAsync().execute(url) calls itself on onPostExecute(),
    // and that's how badLOF resets itself. 

当然,这种方法只有在你能掌握这些文件时才有效。有趣的是,问题是1)可以使用相同的文件重现,2)显然与文件大小本身无关:首先,它发生在大文件和小文件(如100MB和1kB),其次,我经历过它只与HostMonster文件主机有关。不,我没有开车,我喜欢他们的服务质量。只是想知道如何修理断轴,这一切都是......

HTH。