uploadImage method
Upload an image. The server computes all derived metadata. Returns the MediaAsset (existing if deduplicated, new otherwise).
Implementation
@override
Future<MediaAsset> uploadImage(String fileName, Uint8List fileData) async {
final ext = fileName.contains('.')
? fileName.split('.').last.toLowerCase()
: 'bin';
final contentHash = sha256.convert(fileData).toString();
// Try to decode for dimensions; fall back to zeros for non-images.
int width = 0;
int height = 0;
bool hasAlpha = false;
try {
final decoded = img.decodeImage(fileData);
if (decoded != null) {
width = decoded.width;
height = decoded.height;
hasAlpha = decoded.hasAlpha;
}
} catch (_) {
// ignore
}
final assetId = 'image-$contentHash-${width}x$height-$ext';
if (_media.containsKey(assetId)) return _media[assetId]!;
final mimeType = switch (ext) {
'jpg' || 'jpeg' => 'image/jpeg',
'png' => 'image/png',
'gif' => 'image/gif',
'webp' => 'image/webp',
'svg' => 'image/svg+xml',
_ => 'image/$ext',
};
final id = _genMediaId();
final asset = MediaAsset(
id: id,
assetId: assetId,
fileName: fileName,
mimeType: mimeType,
fileSize: fileData.length,
publicUrl: 'https://mock-cdn.test/media/$assetId/$fileName',
width: width,
height: height,
hasAlpha: hasAlpha,
blurHash: 'L00000fQfQfQfQfQfQfQfQfQfQ', // placeholder
createdAt: DateTime.now(),
metadataStatus: MediaAssetMetadataStatus.complete,
);
_media[assetId] = asset;
return asset;
}