Java | 图片地址查询返回参数自动拼接图片前缀地址
一、 在数据库查询时处理(推荐)
- 可以直接在SQL查询中使用MyBatis的
<if>
标签来判断URL是否完整,如果不完整就加上前缀
示例:
<select id="selectListByImgTypeAndId" resultType="String">
<![CDATA[
select
case
when url like 'http%' then url
else CONCAT(#{prefix}, url)
end as url
from img_info
where is_deleted = 0
and type = #{imgType}
and work_id = #{workId}
]]>
</select>
在Mapper接口中,传入一个prefix
参数,用来添加前缀:
public interface ImgInfoMapper extends BaseMapper<ImgInfo> {
List<String> selectListByImgTypeAndId(@Param("imgType") ImgType imgType,
@Param("workId") Long workId,
@Param("prefix") String prefix);
}
使用时传入你想要的前缀:
List<String> imgUrlList = imgInfoMapper.selectListByImgTypeAndId(ImgType.SMALL, id, properties.getEndpoint());
二、 在Java代码中处理
- 可以在Java代码中调用查询方法后,对返回的结果进行前缀添加处理。
示例:
List<String> imgUrlList = imgInfoMapper.selectListByImgTypeAndId(ImgType.SMALL, id);
String prefix = properties.getEndpoint();
imgUrlList = imgUrlList.stream()
.map(url -> url.startsWith("http") ? url : prefix + url)
.collect(Collectors.toList());
三、自定义JsonSerializer实现url拼接
- 自定义的
JsonSerializer
来处理图片URL的拼接,增加了灵活性和可配置性。
关键点:
- 自动拼接域名:通过properties.getEndpoint()从配置文件中获取Minio接口域名,然后根据条件决定是否拼接域名
- 处理多个图片URL:代码处理了可能包含多个图片URL的情况(以逗号分隔),并且确保了每个URL都得到正确处理
- 条件判断:对于已经是完整HTTP URL的图片,不会重复拼接域名,而是直接使用原有的URL
细节优化建议:
- 空值检查:
StrUtil.isBlank(value)
和StrUtil.isBlank(properties.getEndpoint())
的检查确保了在处理空值时不会出现异常 - 正则匹配:通过
ReUtil.isMatch(PatternPool.URL_HTTP, img)
判断是否为完整URL,避免重复拼接
package com.echo.common.ImgJson;
import cn.hutool.core.lang.PatternPool;
import cn.hutool.core.util.ReUtil;
import cn.hutool.core.util.StrUtil;
import com.echo.common.minio.MinioProperties;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.IOException;
@Component
public class ImgJsonSerializer extends JsonSerializer<String> {
@Autowired
private MinioProperties properties;
@Override
public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
if (StrUtil.isBlank(value)) {
gen.writeString(StrUtil.EMPTY);
return;
} else if (StrUtil.isBlank(properties.getEndpoint())) {
gen.writeString(value);
return;
}
String[] imgs = value.split(StrUtil.COMMA);
StringBuilder sb = new StringBuilder();
for (String img : imgs) {
if (ReUtil.isMatch(PatternPool.URL_HTTP, img)) {
sb.append(img).append(StrUtil.COMMA);
} else {
sb.append(properties.getEndpoint()).append(img).append(StrUtil.COMMA);
}
}
sb.deleteCharAt(sb.length() - 1);
gen.writeString(sb.toString());
}
}
使用了hutool依赖,需引入
使用方式
@Schema(description = "图片地址")
@JsonSerialize(using = ImgJsonSerializer.class)
private String imgUrl;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
2023-08-10 Windows 10的IIS中设置虚拟目录后无法打开浏览
2022-08-10 Docker安装步骤