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的拼接,增加了灵活性和可配置性。

关键点:

  1. 自动拼接域名:通过properties.getEndpoint()从配置文件中获取Minio接口域名,然后根据条件决定是否拼接域名
  2. 处理多个图片URL:代码处理了可能包含多个图片URL的情况(以逗号分隔),并且确保了每个URL都得到正确处理
  3. 条件判断:对于已经是完整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;

返回参数自动拼接图片前缀地址
web项目图片地址统一前缀处理

posted @   槑孒  阅读(41)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
历史上的今天:
2023-08-10 Windows 10的IIS中设置虚拟目录后无法打开浏览
2022-08-10 Docker安装步骤
点击右上角即可分享
微信分享提示