PowershellでファイルのMIMEタイプ(Content-Type)を取得してみました。
ファイルのMIMEタイプは以下の場面で利用する機会があるかと思います。
- ファイルの種類を拡張子だけでなくMIMEタイプでもチェックしたい
- Webサーバーへのアップロード処理で、受け取ったファイルのMIMEタイプを検証したい
今回は PowerShell 5.xを利用して試してみました。
PowershellでファイルのMIMEタイプを取得する
.NET Framework の System.Web 名前空間に含まれる MimeMapping クラスを利用して、MIMEタイプを取得できます。
以下のコマンドで取得可能です。
Add-Type -AssemblyName System.Web
$filePath = "C:\hogehoge\hogehoge.txt"
$fileName = [System.IO.Path]::GetFileName($filePath)
$mimeType = [System.Web.MimeMapping]::GetMimeMapping($fileName)
Write-Output "MIMEタイプ: $mimeType"
実行例
実行してみると以下のようにMIMEタイプ(今回は text/plain)が取得できます。
PS C:\> Add-Type -AssemblyName System.Web
PS C:\>
PS C:\> $filePath = "C:\hogehoge\hogehoge.txt"
PS C:\> $fileName = [System.IO.Path]::GetFileName($filePath)
PS C:\>
PS C:\> $mimeType = [System.Web.MimeMapping]::GetMimeMapping($fileName)
PS C:\>
PS C:\> Write-Output "MIMEタイプ: $mimeType"
MIMEタイプ: text/plain
[参考] 拡張子が不明な場合
WindowsのMIMEマッピングに登録されていない拡張子の場合「application/octet-stream」と表示されます。
MIMEタイプ: application/octet-stream
[参考] PowerShell 7.xの場合
PowerShell 7.xではSystem.Webがデフォルトでは読み込めません。
代わりに、次のように独自のロジックを作成してMIMEタイプを判定可能です。
$filePath = "C:\hogehoge\hogehoge.txt"
$fileExtension = [System.IO.Path]::GetExtension($filePath)
# 判定ロジックを手動で作成
$mimeDictionary = @{
".txt" = "text/plain"
".jpg" = "image/jpeg"
".png" = "image/png"
# 必要に応じて追加
}
$mimeType = $mimeDictionary[$fileExtension.ToLower()] ?? "application/octet-stream"
Write-Output "MIMEタイプ: $mimeType"
実行結果
PS C:\> $filePath = "C:\hogehoge\hogehoge.txt"
PS C:\>
PS C:\> $fileExtension = [System.IO.Path]::GetExtension($filePath)
PS C:\>
PS C:\> # 判定ロジックを手動で作成
PS C:\> $mimeDictionary = @{
>> ".txt" = "text/plain"
>> ".jpg" = "image/jpeg"
>> ".png" = "image/png"
>> # 必要に応じて追加
>> }
PS C:\>
PS C:\> $mimeType = $mimeDictionary[$fileExtension.ToLower()] ?? "application/octet-stream"
PS C:\>
PS C:\> Write-Output "MIMEタイプ: $mimeType"
MIMEタイプ: text/plain
PS C:\>