此网址中未找到内容长度

时间:2017-11-22 11:13:11

标签: android gzip http-content-length

String thisurl ="http://songolum.com/file/ppdVkTxqhwcJu-CAzCgtNeICMi8mHZnKQBgnksb5o2Q/Ed%2BSheeran%2B-%2BPerfect.mp3?r=idz&dl=311&ref=ed-sheran-perfect";
url = null;
try {
     url = new URL(thisurl);
     HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            try {
              //  urlConnection.setRequestProperty("Transfer-Encoding", "chunked");
                urlConnection.setRequestProperty("Accept-Encoding", "identity");
                urlConnection.setDoOutput(true);
                urlConnection.setChunkedStreamingMode(0);

int l=0;
      InputStream in = new BufferedInputStream(urlConnection.getInputStream());
      while(in.read()!=-1)
            {
            l=l+in.read();
            }
      System.out.println("Content-length" +l);

**我用其他软件检查过,我发现它是gzip压缩文件,它的内存为10mb,我差不多1mb **

2 个答案:

答案 0 :(得分:1)

直接回答你的问题,你错了,因为你两次调用read(),还因为你把每个字节读取的值加在一起,而不是计算它们。 InputStream.read()读取一个字节并返回其值,或者在EOF上返回-1。您需要将许多字节读入缓冲区并计算每次read()调用返回的字节数:

  InputStream in = urlConnection.getInputStream();
  byte[] buffer = new byte[4096];
  int countBytesRead;
  while((countBytesRead = in.read(buffer)) != -1) {
      l += countBytesRead;
  }
  System.out.println("Content-length: " + l);

但是,我怀疑这不是你真正需要做的。上面的代码将简单地返回响应中所有内容的大小,包括HTTP标头和内容。也许您要找的是文档的长度(或要下载的文件)。您可以使用Content-length HTTP标头来实现此目的(有关如何获取HTTP标头,请参阅其他SO问题)。

另请注意,内容可能是也可能不是gzip压缩的。这取决于它接受的HTTP请求。

答案 1 :(得分:0)

请尝试这个希望,这样对你有所帮助。

使用HEAD请求,我让我的网络服务器回复了正确的内容长度字段,否则这是错误的。我不知道这是否有效,但就我而言:

private int tryGetFileSize(URL url) {
    HttpURLConnection conn = null;
    try {
        conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("HEAD");
        conn.getInputStream();
        return conn.getContentLength();
    } catch (IOException e) {
        return -1;
    } finally {
        conn.disconnect();
    }
}