Files
RuoYi-Vue/ruoyi-system/src/main/java/com/ruoyi/app/service/ImageUrlService.java

132 lines
3.7 KiB
Java
Raw Normal View History

package com.ruoyi.app.service;
import com.ruoyi.app.domain.AppBlogArticle;
import com.ruoyi.app.domain.AppResource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* Builds CDN image variants without persisting derived URLs in the database.
*/
@Component
public class ImageUrlService
{
@Value("${app.image.cdn-domain:https://img.yidaima.cn}")
private String cdnDomain;
@Value("${app.image.article-card-operation:imageView2/1/w/600/h/375/format/webp/q/75/ignore-error/1}")
private String articleCardOperation;
@Value("${app.image.resource-card-operation:imageView2/1/w/500/h/400/format/webp/q/75/ignore-error/1}")
private String resourceCardOperation;
public void decorateArticles(List<AppBlogArticle> articles)
{
if (articles == null)
{
return;
}
for (AppBlogArticle article : articles)
{
decorateArticle(article);
}
}
public AppBlogArticle decorateArticle(AppBlogArticle article)
{
if (article == null)
{
return null;
}
String originalUrl = normalizeOriginalUrl(article.getShowImg());
article.setShowImg(originalUrl);
article.setShowImgThumb(buildThumbnailUrl(originalUrl, articleCardOperation));
decorateResource(article.getAppResource());
return article;
}
public void decorateResources(List<AppResource> resources)
{
if (resources == null)
{
return;
}
for (AppResource resource : resources)
{
decorateResource(resource);
}
}
public AppResource decorateResource(AppResource resource)
{
if (resource == null)
{
return null;
}
String originalUrl = normalizeOriginalUrl(resource.getShowImg());
resource.setShowImg(originalUrl);
resource.setShowImgThumb(buildThumbnailUrl(originalUrl, resourceCardOperation));
return resource;
}
public String normalizeOriginalUrl(String originalUrl)
{
if (originalUrl == null)
{
return null;
}
String url = originalUrl.trim();
String host = cdnHost();
String httpPrefix = "http://" + host + "/";
if (url.startsWith(httpPrefix))
{
return "https://" + url.substring("http://".length());
}
String protocolRelativePrefix = "//" + host + "/";
if (url.startsWith(protocolRelativePrefix))
{
return "https:" + url;
}
return url;
}
private String buildThumbnailUrl(String originalUrl, String operation)
{
if (originalUrl == null || originalUrl.isEmpty())
{
return originalUrl;
}
String cdnPrefix = "https://" + cdnHost() + "/";
if (!originalUrl.startsWith(cdnPrefix))
{
return originalUrl;
}
// Avoid corrupting signed or already processed URLs.
if (originalUrl.indexOf('?') >= 0)
{
return originalUrl;
}
return originalUrl + "?" + operation;
}
private String cdnHost()
{
String value = cdnDomain == null ? "img.yidaima.cn" : cdnDomain.trim();
if (value.startsWith("https://"))
{
value = value.substring("https://".length());
}
else if (value.startsWith("http://"))
{
value = value.substring("http://".length());
}
while (value.endsWith("/"))
{
value = value.substring(0, value.length() - 1);
}
return value;
}
}