Okhttp检查文件大小而不下载文件

时间:2016-02-11 06:09:39

标签: android okhttp http-content-length

okhttp的常见示例涵盖了get和post的场景。

但我需要使用url获取文件的文件大小。由于我需要通知用户,并且只有在获得批准后才能下载文件。

目前我正在使用此代码

URL url = new URL("http://server.com/file.mp3");
URLConnection urlConnection = url.openConnection();
urlConnection.connect();
int file_size = urlConnection.getContentLength();

在此stackoverflow问题How to know the size of a file before downloading it?

中提到

哪个有效,但是因为我在我的项目中使用okhttp来获取其他请求,所以我也希望将它用于此场景。

3 个答案:

答案 0 :(得分:4)

public static long getRemoteFileSize(String url) {
    OkHttpClient client = new OkHttpClient();
    // get only the head not the whole file
    Request request = new Request.Builder().url(url).head().build();
    Response response=null;
    try {
        response = client.newCall(request).execute();
        // OKHTTP put the length from the header here even though the body is empty 
        long size = response.body().contentLength();
        response.close();
        return  size;
    } catch (IOException e) {
        if (response!=null) {
            response.close();

        }
        e.printStackTrace();
    }
    return 0;

}

答案 1 :(得分:1)

我无法确定您的情况是否可行。但一般策略是首先向服务器发出HTTP“HEAD”请求以获取该URL。这不会返回URL的完整内容。相反,它只会返回描述URL的标题。如果服务器知道URL后面的内容大小,则将在响应中设置Content-Length标头。但服务器可能不知道 - 这取决于你找出来。

如果用户同意大小,那么您可以为URL执行典型的“GET”交易,这将返回正文中的整个内容。

答案 2 :(得分:0)

private final OkHttpClient client = new OkHttpClient();


public long run() throws Exception {
         Request request = new Request.Builder()
                 .url("http://server.com/file.mp3")
                 .build();

         Response response = client.newCall(request).execute();
        return  response.body().contentLength();
}