Flutter: это изображение или нет?
Я хочу загрузить все изображения, находящиеся в данном каталоге, и исключить все файлы, не являющиеся изображениями.
Я не хочу просто проверять расширения, потому что существуют разные соглашения, такие как «.jpg» и «jpeg», и потому что я не хочу вручную добавлять новые расширения, если Flutter будет поддерживать больше форматов изображений в будущем. Также я хочу, чтобы пользователь мог загружать файлы изображений, даже если у них нет правильного имени расширения.
Как я могу определить, является ли файл (поддерживаемым) изображением или нет?
Когда Flutter пытается отобразить файл без изображения в виджете «Изображение», он выводит в консоль следующую ошибку: «Возникло другое исключение: Исключение: недопустимые данные изображения». К сожалению, эта ошибка появляется только тогда, когда Flutter уже создает виджет, поэтому во время загрузки пытается обнаружить не изображения, например:
void getFiles(path) async {
//asyn function to get list of files
var currentDir = Directory(path);
files = [];
await for (var entity
in currentDir.list(recursive: false, followLinks: false)) {
if (entity is File) {
try {
var image = Image(image: FileImage(entity));
files.add(entity.path);
} catch (e) {
print(e);
}
}
}
}
не работает.
Целевая платформа для приложения - рабочий стол, поэтому я не просто получаю доступ к галерее.
1 ответ
Вы можете использовать пакет mime от команды Dart для извлечения типов MIME из имен файлов:
import 'package: mime / mime.dart';
final mimeType = lookupMimeType('/some / path / to / file / file.jpg'); окончательный mimeType = lookupMimeType ('/ some / path / to / file / file.jpg'); // Вспомогательные функции 'image / jpeg'
Если вы хотите знать, представляет ли путь к файлу изображение, вы можете создать такую функцию:
import 'package: mime / mime.dart';
bool isImage(String path) {final mimeType = lookupMimeType(путь);
вернуть mimeType.startsWith ('изображение /'); } Аналогичным образом, если вы хотите знать, представляет ли путь документ, вы можете написать такую функцию:
import 'package: mime / mime.dart';
bool isDocument (String path) {final mimeType = lookupMimeType(путь);
return mimeType == 'application / msword';} Вы можете найти списки типов MIME в IANA или посмотреть карту расширений в пакете mime.
Из заголовков файлов
С помощью пакета mime вы даже можете проверить байты заголовка файла:
final mimeType = lookupMimeType('image_without_extension', headerBytes: [0xFF, 0xD8]); // jpeg