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

Другие вопросы по тегам