167 lines
4.3 KiB
Dart
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, // 未知类型
|
|
}
|