异常记录检测修改

This commit is contained in:
super
2026-05-04 19:04:55 +08:00
parent f46c231323
commit 111f30d150
70 changed files with 7182 additions and 252 deletions
@@ -0,0 +1,73 @@
package com.nanri.aiimage.common.util;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.http.HttpHeaders;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
public final class DownloadHeaderUtil {
private static final String DEFAULT_FILENAME = "download";
private DownloadHeaderUtil() {
}
public static void setAttachment(HttpServletResponse response, String filename) {
response.setHeader(HttpHeaders.CONTENT_DISPOSITION, contentDisposition(filename));
}
public static String contentDisposition(String filename) {
String normalized = normalizeFilename(filename);
String encodedFilename = URLEncoder.encode(normalized, StandardCharsets.UTF_8).replace("+", "%20");
return "attachment; filename=\"" + asciiFallback(normalized) + "\"; filename*=UTF-8''" + encodedFilename;
}
private static String normalizeFilename(String filename) {
if (filename == null || filename.isBlank()) {
return DEFAULT_FILENAME;
}
return filename.replace("\r", "").replace("\n", "").trim();
}
private static String asciiFallback(String filename) {
String normalized = normalizeFilename(filename);
String extension = extensionOf(normalized);
String base = extension.isEmpty() ? normalized : normalized.substring(0, normalized.length() - extension.length() - 1);
String sanitizedBase = sanitizeAscii(base);
String sanitizedExtension = sanitizeExtension(extension);
if (sanitizedBase.isBlank()) {
sanitizedBase = DEFAULT_FILENAME;
}
String fallback = sanitizedExtension.isBlank() ? sanitizedBase : sanitizedBase + "." + sanitizedExtension;
return fallback.length() <= 120 ? fallback : shorten(fallback, sanitizedExtension);
}
private static String extensionOf(String filename) {
int dotIndex = filename.lastIndexOf('.');
if (dotIndex < 0 || dotIndex == filename.length() - 1) {
return "";
}
return filename.substring(dotIndex + 1);
}
private static String sanitizeAscii(String value) {
return value.replaceAll("[^A-Za-z0-9._-]", "_")
.replaceAll("_+", "_")
.replaceAll("^[_\\.]+|[_\\.]+$", "");
}
private static String sanitizeExtension(String extension) {
return extension.replaceAll("[^A-Za-z0-9]", "");
}
private static String shorten(String fallback, String extension) {
int maxBaseLength = extension.isBlank() ? 120 : Math.max(1, 119 - extension.length());
String base = extension.isBlank() ? fallback : fallback.substring(0, fallback.length() - extension.length() - 1);
base = base.substring(0, Math.min(base.length(), maxBaseLength)).replaceAll("[_\\.]+$", "");
if (base.isBlank()) {
base = DEFAULT_FILENAME;
}
return extension.isBlank() ? base : base + "." + extension;
}
}