はじめに
こんばんは。
Laravelプロジェクトでマクロ付きのエクセルファイルをアップロードしたりして、それをもとにモニョモニョするみたいなプロジェクトをしております。
今回パスワード付きのxlsmを扱ったさいにちょっといつもと違ったので、備忘録しておきます。
本番
今までアップロード時のValidationは 以下みたいにしていました。
'file' => [
'required',
'file',
'mimes:xlsx,xlsm',
],
今回パスワード付きのxlsmを扱った際にMimeTypeのバリデーションに引っかかってしまいました。
直接以下みたいにしてみてもだめでした。
'file' => [
'required',
'file',
'mimetypes:application/vnd.ms-excel.sheet.macroEnabled.12',
],
送られているxlsmファイルのMimeTypeが実際違うのか?と思って調べてたらMimeTypeは application/encrypted でした...
なるほど。。。
今回エクセルかつ、パスワード付きってことなので、新たにRuleを作って適用するようにしました。
<?php namespace App\Rules\Excel; use Closure; use Illuminate\Contracts\Validation\ValidationRule; use Illuminate\Http\UploadedFile; class PasswordExcelRule implements ValidationRule { private const string VALID_CLIENT_MIME_TYPE = 'application/vnd.ms-excel.sheet.macroenabled.12'; private const string VALID_MIME_TYPE = 'application/encrypted'; public function validate(string $attribute, mixed $value, Closure $fail): void { /** @var UploadedFile $file */ $file = $value; if ($file->getClientMimeType() !== self::VALID_CLIENT_MIME_TYPE) { $fail('エクセルファイルの形式が不正なもの可能性があります。'); } if ($file->getMimeType() !== self::VALID_MIME_TYPE) { $fail('エクセルファイルの形式が不正なもの可能性があります。'); } } }
終わりに
結構ハマっちゃいました...
現場からは以上です。