public static string?GuessFileNameFromUrl(string url, int?limitedFileNameLength = null, string?fallbackName = null) { var lastSlash = url.LastIndexOf('/') + 1; var lastQuery = url.IndexOf('?'); if (lastSlash < 0) { return(fallbackName); } // 取 URL 中可能是文件名的部分。 var name = lastQuery < 0 ? url.Substring(lastSlash) : url.Substring(lastSlash, lastQuery - lastSlash); // 对 URL 反转义。 var unescapedName = Uri.UnescapeDataString(name); // 限制文件名长度。 string?limitedFileName = limitedFileNameLength is null ? unescapedName : unescapedName.Length <= limitedFileNameLength.Value ? unescapedName : fallbackName; // 确保文件名字符是安全的。 string?safeFileName = limitedFileName is null ? limitedFileName : FileNameHelper.MakeSafeFileName(limitedFileName); return(safeFileName); }