【问题标题】:While downloading getcontentlength() returns -1 in Android下载 getcontentlength() 在 Android 中返回 -1
【发布时间】:2014-07-20 04:43:09
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      阅读这个。documentation

      getContentLength() 返回内容长度头域的值。

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

      【讨论】:

      • 如果相同的 url 通过 java 应用程序命中,它的工作正常。但它不适用于 iphone 和 android。
      【解决方案3】:

      同样的事情也一直发生在我身上。这个 -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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-22
        • 1970-01-01
        • 1970-01-01
        • 2012-07-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多