diff --git a/CHANGELOG.md b/CHANGELOG.md index 31e482d9f3..ab0a72311f 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ * 【core 】 ZipReader增加setMaxSizeDiff方法,自定义或关闭ZipBomb(issue#3018@Github) * 【db 】 Query.of(entity)构建时传入fields(issue#I7M5JU@Gitee) * 【db 】 clickhouse驱动名称变更为com.clickhouse.jdbc.ClickHouseDriver(issue#3224@Github) +* 【core 】 UrlResource增加size方法(issue#3226@Github) ### 🐞Bug修复 * 【core 】 修复MapUtil工具使用filter方法构造传入参数结果问题(issue#3162@Github) diff --git a/hutool-core/src/main/java/cn/hutool/core/io/resource/UrlResource.java b/hutool-core/src/main/java/cn/hutool/core/io/resource/UrlResource.java index 21f24b2ef4..ab65a90700 100755 --- a/hutool-core/src/main/java/cn/hutool/core/io/resource/UrlResource.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/resource/UrlResource.java @@ -1,14 +1,14 @@ package cn.hutool.core.io.resource; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.IORuntimeException; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.URLUtil; -import java.io.File; -import java.io.InputStream; -import java.io.Serializable; +import java.io.*; import java.net.URI; import java.net.URL; +import java.net.URLConnection; /** * URL资源访问类 @@ -104,4 +104,14 @@ public File getFile(){ public String toString() { return (null == this.url) ? "null" : this.url.toString(); } + + /** + * 获取资源长度 + * + * @return 资源长度 + * @since 5.8.21 + */ + public long size() { + return URLUtil.size(this.url); + } } diff --git a/hutool-core/src/main/java/cn/hutool/core/util/URLUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/URLUtil.java index fde460ff20..a66463e67a 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/URLUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/URLUtil.java @@ -776,4 +776,51 @@ public static String getDataUri(String mimeType, Charset charset, String encodin return builder.toString(); } + + /** + * 获取URL对应数据长度 + * + * + * @param url URL + * @return 长度 + * @since 6.0.0 + */ + public static long size(final URL url) { + if (URLUtil.isFileURL(url)) { + // 如果资源以独立文件形式存在,尝试获取文件长度 + final File file = FileUtil.file(url); + final long length = file.length(); + if (length == 0L && !file.exists()) { + throw new IORuntimeException("File not exist or size is zero!"); + } + return length; + } else { + // 如果资源打在jar包中或来自网络,使用网络请求长度 + // issue#3226, 来自Spring的AbstractFileResolvingResource + try { + final URLConnection con = url.openConnection(); + useCachesIfNecessary(con); + if (con instanceof HttpURLConnection) { + final HttpURLConnection httpCon = (HttpURLConnection) con; + httpCon.setRequestMethod("HEAD"); + } + return con.getContentLengthLong(); + } catch (final IOException e) { + throw new IORuntimeException(e); + } + } + } + + /** + * 如果连接为JNLP方式,则打开缓存 + * + * @param con {@link URLConnection} + * @since 6.0.0 + */ + public static void useCachesIfNecessary(final URLConnection con) { + con.setUseCaches(con.getClass().getSimpleName().startsWith("JNLP")); + } }