异常记录检测修改
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user