chatapp3-flutter/lib/shared/tools/sc_path_utils.dart
2026-04-14 17:21:05 +08:00

167 lines
4.3 KiB
Dart

import 'package:path/path.dart' as path;
class SCPathUtils {
/// 判断路径类型
static PathType getPathType(String uri) {
if (uri.isEmpty) return PathType.unknown;
// 1. 检查网络地址
if (_nt(uri)) return PathType.network;
// 2. 检查 Asset 路径
if (_as(uri)) return PathType.asset;
// 3. 检查文件路径
if (_fl(uri)) return PathType.file;
return PathType.unknown;
}
// 检查是否是网络地址
static bool _nt(String uri) {
final uriPattern = RegExp(
r'^(https?|ftp):\/\/' // 协议
r'([\w\-]+(\.[\w\-]+)+)' // 域名
r'(:\d+)?' // 端口
r'(\/[^\s]*)?$', // 路径
caseSensitive: false,
);
return uriPattern.hasMatch(uri) || uri.startsWith('http');
}
// 检查是否是 Asset 路径
static bool _as(String uri) {
// 排除包含特殊字符的情况
if (uri.contains('://') || uri.contains('\\') || path.isAbsolute(uri)) {
return false;
}
// 常见的 asset 路径特征
final isDirectAsset =
uri.startsWith('assets/') ||
uri.startsWith('sc_images/') ||
uri.startsWith('videos/');
// 检查文件扩展名
final ext = path.extension(uri).toLowerCase();
final isSupportedAsset = [
'.png',
'.jpg',
'.jpeg',
'.gif',
'.mp4',
'.vap',
'.svga',
].contains(ext);
return isDirectAsset && isSupportedAsset;
}
// 检查是否是文件路径
static bool _fl(String uri) {
// 检查文件 URI 格式
if (uri.startsWith('file://')) return true;
// 检查绝对路径
if (path.isAbsolute(uri)) return true;
// 检查 Windows 路径
if (uri.contains(':\\') || uri.contains(':/')) return true;
// 检查常见文件扩展名
final ext = path.extension(uri).toLowerCase();
return [
'.mp4',
'.mov',
'.avi',
'.svga',
'.png',
'.jpg',
'.txt',
'.pdf',
].contains(ext);
}
/// 获取路径的文件名(无扩展名)
static String getFileNameWithoutExtension(String filePath) {
return path.basenameWithoutExtension(filePath);
}
/// 获取路径的文件扩展名
static String getFileExtension(String filePath) {
return path.extension(filePath).toLowerCase();
}
/// 从网络地址中提取文件名
static String getFileNameFromUrl(String url) {
try {
final uri = Uri.parse(url);
return path.basename(uri.path);
} catch (e) {
return 'unknown_file';
}
}
static String getFileType(String filePath) {
String extension = path.extension(filePath).toLowerCase();
// 图片格式
final imageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp'];
// 视频格式
final videoExtensions = ['.mp4', '.avi', '.mov', '.wmv', '.flv', '.mkv'];
if (imageExtensions.contains(extension)) {
return 'image';
} else if (videoExtensions.contains(extension)) {
return 'video_pic';
} else {
return 'unknown';
}
}
static bool fileTypeIsPicAndMP4(String filePath) {
String extension = path.extension(filePath).toLowerCase();
// 图片格式
final imageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp'];
// 视频格式
final videoExtensions = ['.mp4'];
if (imageExtensions.contains(extension) ||
videoExtensions.contains(extension)) {
return true;
}
return false;
}
static bool fileTypeIsPic(String filePath) {
String extension = path.extension(filePath).toLowerCase();
// 图片格式
// final imageExtensions = ['.jpg', '.jpeg', '.png', '.bmp', '.webp'];
final imageExtensions = ['.jpg', '.jpeg', '.png'];
if (imageExtensions.contains(extension)) {
return true;
}
return false;
}
static bool fileTypeIsPic2(String filePath) {
String extension = path.extension(filePath).toLowerCase();
// 图片格式
final imageExtensions = ['.jpg', '.jpeg', '.png', '.bmp', '.webp'];
if (imageExtensions.contains(extension)) {
return true;
}
return false;
}
}
enum PathType {
asset, // 资源文件 (assets/)
file, // 本地文件路径
network, // 网络地址
unknown, // 未知类型
}