Как мне прочитать / записать файл изображения с его исходным расширением, когда вы получаете изображение в виде байтов во Flutter? - PullRequest
0 голосов
/ 09 июля 2020

Вот проблема, с которой я столкнулся:

Мои пользователи могут установить изображение своего профиля либо из Facebook (в формате jpeg или gif), либо с локального устройства (которым может быть png, jpg или другое).

Я получаю изображение из Facebook, используя:

// Get the name, email and picture
final graphResponse = await http.get(
        'https://graph.facebook.com/v4.0/me?fields=name,email,picture.width(300).height(300)&access_token=$token');

// Decode JSON
final profile = jsonDecode(graphResponse.body);
final String stringData = profile['picture']['data'];
final bytes = Uint8List.fromList(stringData.codeUnits);

И получаю изображение с локального устройства:

final imagePicker = ImagePicker();

// Call image picker
final pickedFile = await imagePicker.getImage(
      source: ImageSource.gallery,
      maxWidth: MAX_WIDTH_PROFILE_IMAGE,
  );

final imageBytes = await pickedFile.readAsBytes();

Тогда все, что у меня здесь, находится в байтах (Uint8List ), как мне сохранить его в соответствии с его исходным расширением?

Затем, позже, как мне прочитать их снова, не проверяя его расширение?

Например, с:

// Setting the filename
// Could be jpg or png or bmp or gif. 
// How to determine the extension?
final filename = 'myProfileImage'; 

// Getting App's local directory
final Directory localRootDirectory =
          await getApplicationDocumentsDirectory();
final String filePath = p.join(localRootDirectory.path, path, filename);

final file = File(filePath);

Видите ли, при чтении файла нам нужно указать полное имя файла. А как тогда определить расширение?

1 Ответ

1 голос
/ 09 июля 2020

Вы можете полностью избежать работы с расширениями, просто не задав расширение в имени файла. Расширения существуют только для указания того, что вероятно, содержится в файле для ОС, но они не являются необходимыми и не нужны в вашем случае, тем более, что вы знаете, что у вас есть какие-то данные изображения в этом файле. и ваше приложение, вероятно, единственное, что когда-либо использовало этот файл.

Однако, если вы действительно хотите использовать расширения в имени файла, вы можете использовать пакет изображений . Это обеспечивает Decoder абстрактный класс с множеством средств реализации для различных методов кодирования изображений. Чтобы определить, какой метод был использован для вашего файла, вы можете проверить с помощью isValidFile каждого возможного типа декодера, который вам нужен, и написать соответствующее расширение.

Пример:

PngDecoder png = PngDecoder();
if(png.isValidFile(data //Uint8List inputted here)) {
  print("This file is a PNG");
}
...