Flutterアプリでファイルを扱う際、
- 画像かどうか判定したい
- アップロード前にファイル形式を確認したい
- HTTPリクエストに適切なContent-Typeを設定したい
- ファイル拡張子からMIMEタイプを取得したい
といったケースがあります。
例えば、.jpg は image/jpeg、.pdf は application/pdf のように、それぞれ適切なMIMEタイプがあります。
そんなときに便利なのが mime パッケージです。
この記事では、FlutterでMIMEタイプを簡単に判定できる「mime」の使い方や特徴を解説します。
MIMEタイプとは?
MIME(Multipurpose Internet Mail Extensions)タイプとは、ファイルの種類を表す識別子です。
代表的なものは以下の通りです。
| ファイル | MIMEタイプ |
|---|---|
| jpg | image/jpeg |
| png | image/png |
| gif | image/gif |
| application/pdf | |
| json | application/json |
| mp4 | video/mp4 |
| mp3 | audio/mpeg |
| html | text/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でファイルを扱うアプリを開発する際には、ぜひ活用したいパッケージです。
