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来获取其他请求,所以我也希望将它用于此场景。
答案 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();
}