FlutterでファイルのMIMEタイプを判定できるパッケージ mime

Flutterアプリでファイルを扱う際、

  • 画像かどうか判定したい
  • アップロード前にファイル形式を確認したい
  • HTTPリクエストに適切なContent-Typeを設定したい
  • ファイル拡張子からMIMEタイプを取得したい

といったケースがあります。

例えば、.jpgimage/jpeg.pdfapplication/pdf のように、それぞれ適切なMIMEタイプがあります。

そんなときに便利なのが mime パッケージです。

この記事では、FlutterでMIMEタイプを簡単に判定できる「mime」の使い方や特徴を解説します。


MIMEタイプとは?

MIME(Multipurpose Internet Mail Extensions)タイプとは、ファイルの種類を表す識別子です。

代表的なものは以下の通りです。

ファイルMIMEタイプ
jpgimage/jpeg
pngimage/png
gifimage/gif
pdfapplication/pdf
jsonapplication/json
mp4video/mp4
mp3audio/mpeg
htmltext/html

HTTP通信では、このMIMEタイプを Content-Type ヘッダーとして送信することで、受信側はファイルの種類を判断できます。


mimeとは?

mimeは、Dart公式(tools.dart.dev)が提供するライブラリで、ファイルのMIMEタイプや拡張子を扱うためのユーティリティです。

主な機能は以下の通りです。

  • ファイル名からMIMEタイプを判定
  • ファイル先頭のバイト列(マジックナンバー)から判定
  • MIMEタイプから拡張子を取得
  • multipartデータの解析

Flutterだけでなく、純粋なDartプロジェクトでも利用できます。


インストール

まずは pubspec.yaml に追加します。

dependencies:
  mime: ^2.0.0

続いて、

flutter pub get

を実行します。


基本的な使い方

まずはライブラリを読み込みます。

import 'package:mime/mime.dart';

もっとも簡単な使い方は lookupMimeType() です。

final mimeType =
    lookupMimeType('sample.jpg');

print(mimeType);

出力

image/jpeg

拡張子から自動的にMIMEタイプを判定してくれます。


PDFの判定

PDFも同様です。

final mimeType =
    lookupMimeType('document.pdf');

結果

application/pdf

ファイルが画像か判定する

画像のみアップロードを許可したい場合は、

final mime =
    lookupMimeType(file.path);

if (mime?.startsWith('image/') ?? false) {
  print('画像です');
}

これだけで、

  • JPEG
  • PNG
  • GIF
  • WebP

などすべて判定できます。


動画かどうか判定

動画だけ許可する場合。

if (mime?.startsWith('video/') ?? false) {
  print('動画です');
}

対応例

video/mp4
video/webm
video/quicktime

音声ファイルを判定

音楽ファイルだけ許可したい場合。

if (mime?.startsWith('audio/') ?? false) {
  print('音声ファイルです');
}

例えば

audio/mpeg
audio/wav
audio/aac

などが対象になります。


マジックナンバーで判定

拡張子だけではなく、

ファイルの先頭バイト(マジックナンバー)から判定することもできます。

final mime =
    lookupMimeType(
      'sample',
      headerBytes: [
        0xFF,
        0xD8,
      ],
    );

結果

image/jpeg

たとえ拡張子が間違っていても、実際のファイル内容から判定できるため、より安全です。


MIMEタイプから拡張子を取得

逆に、

MIMEタイプから拡張子を取得することもできます。

final extension =
    extensionFromMime(
      'image/jpeg',
    );

print(extension);

結果

jpg

対応例

extensionFromMime(
  'application/pdf',
);

結果

pdf

HTTPアップロードで利用する

HTTP通信ではContent-Typeを設定するケースがあります。

final mime =
    lookupMimeType(file.path);

print(mime);

例えば、

image/png

が取得できれば、

Content-Type: image/png

として送信できます。


file_pickerとの組み合わせ

Flutterでは file_picker と組み合わせるケースがよくあります。

final result =
    await FilePicker.platform
        .pickFiles();

if (result != null) {

  final file =
      result.files.single;

  final mime =
      lookupMimeType(file.name);

  print(mime);

}

アップロード前のバリデーションに便利です。


image_pickerとの組み合わせ

画像選択後にも利用できます。

final image =
    await picker.pickImage(
      source: ImageSource.gallery,
    );

if (image != null) {

  final mime =
      lookupMimeType(image.path);

  print(mime);

}

メリット

実装が非常にシンプル

lookupMimeType() を呼び出すだけで利用できます。

マジックナンバー判定対応

拡張子だけではなく、実際のファイル内容から判定できます。

Dart公式ライブラリ

Dartチームが提供・保守しているため、安心して利用できます。

クロスプラットフォーム対応

Android・iOS・Web・Windows・macOS・Linuxすべてで利用できます。


注意点

判定できない形式もある

一般的なファイル形式には対応していますが、独自拡張子や特殊なファイル形式は判定できない場合があります。

その場合は null が返るため、必ずチェックしましょう。

final mime =
    lookupMimeType(path);

if (mime == null) {
  print('判定できません');
}

MIMEタイプだけで安全とは限らない

MIMEタイプはファイル形式を判定するためのものであり、安全性を保証するものではありません。

アップロード機能では、

  • ファイルサイズ
  • 拡張子
  • ウイルススキャン

などと組み合わせてチェックすることをおすすめします。


まとめ

mimeは、FlutterやDartでファイルのMIMEタイプを簡単に判定できる定番ライブラリです。

特に、

  • ファイルアップロード
  • HTTP通信
  • 画像判定
  • 動画判定
  • Content-Type設定

などの用途では欠かせない存在です。

また、拡張子だけでなくマジックナンバーによる判定にも対応しているため、より信頼性の高いファイル形式チェックを実現できます。Flutterでファイルを扱うアプリを開発する際には、ぜひ活用したいパッケージです。

タイトルとURLをコピーしました