如何在Flutter中从base64字符串获取文件扩展名|镖

How to get file extension from base64 String in Flutter | Dart

我有一个来自 api 的文档的 base64 字符串。我想知道那是哪种 extension/file 格式。因为如果它在 jpg/jpeg/png 中,我想在图像小部件中显示它。或者,如果它是 pdf 格式,我想在 PdfView 小部件中显示它。那么有没有办法从base64获取文件扩展名。有配套吗?

如果您有 base64 字符串,您可以通过检查 base64 字符串的第一个字符来检测文件类型:

'/' 表示 jpeg。

'i'表示png。

'R'表示gif。

'U'表示webp.

'J'表示PDF。

我为此编写了一个函数:

String getBase64FileExtension(String base64String) {
    switch (base64String.characters.first) {
      case '/':
        return 'jpeg';
      case 'i':
        return 'png';
      case 'R':
        return 'gif';
      case 'U':
        return 'webp';
      case 'J':
        return 'pdf';
      default:
        return 'unknown';
    }
  }

如果您没有原始文件名,就无法恢复它。那是不属于文件内容的元数据,base64 编码仅对文件内容起作用。最好能保存原文件名

如果不行,可以用package:mime to guess the MIME type of the file from a small amount of binary data. You could decode the first n×4 characters from the base64 string (a valid base64 string must have a length that's a multiple of 4), decode it, and call lookupMimeType

package:mime 有一个 defaultMagicNumbersMaxLength 值,您可以使用该值动态计算 n

import 'dart:convert';
import 'package:mime/mime.dart' as mime;

String? guessMimeTypeFromBase64(String base64String) {
  // Compute the minimum length of the base64 string we need to decode
  // [mime.defaultMagicNumbersMaxLength] bytes.  base64 encodes 3 bytes of
  // binary data to 4 characters.  
  var minimumBase64Length = (mime.defaultMagicNumbersMaxLength / 3).ceil() * 4;
  return mime.lookupMimeType(
    '',
    headerBytes: base64.decode(base64String.substring(0, minimumBase64Length)),
  );
}

对于 package:mime 支持的类型,mime.defaultMagicNumbersMaxLength 是 12(这意味着需要解码 base64 字符串的前 16 个字节)。