From d179823a2a96d721f3b09efbf925ebd69667e3a9 Mon Sep 17 00:00:00 2001 From: Looly Date: Sat, 29 Jul 2023 13:05:39 +0800 Subject: [PATCH] =?UTF-8?q?UrlResource=E5=A2=9E=E5=8A=A0size=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + .../hutool/core/io/resource/UrlResource.java | 16 +++++-- .../java/cn/hutool/core/util/URLUtil.java | 47 +++++++++++++++++++ 3 files changed, 61 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 31e482d9f..ab0a72311 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 21f24b2ef..ab65a9070 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 class UrlResource implements Resource, Serializable{ 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 fde460ff2..a66463e67 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 class URLUtil extends URLEncodeUtil { 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")); + } }