はじめに
チャットシステムの画像アップロード機能でエラーが発生し、原因を特定するのに苦労したので、備忘録として残しておきます。
同じ問題で悩んでいる方の参考になれば幸いです。
発生した現象
画像アップロード機能では、5MB以下のファイルのみアップロードできるように設定していました。普段は問題なく動作していたのですが、ある画像(約4MB)をアップロードしようとした際に、突然エラーが発生…。原因を探るべく、調査を開始しました。
原因追及
クライアントから送信されたファイルデータをデバッグしてみました。そうすると、以下のように表示されました。
'file' =>
\Illuminate\Http\UploadedFile::__set_state(array(
'test' => false,
'originalName' => '26074.jpg',
'mimeType' => 'image/jpeg',
'error' => 1,
'originalPath' => '26074.jpg',
'hashName' => NULL,
)),
よくみてみると、error
の箇所が1になっています。1ということはなにかファイルアップロードでエラーが起きているぞと、、恥ずかしながら、ファイルアップロードのエラーコードについて知見があまりなかったので、この1
が意味することがわかりませんでした。そこでエラーコードを調べてみました。
(参考)
コード | エラー定数 | 説明 |
---|---|---|
0 | UPLOAD_ERR_OK | エラーなし |
1 | UPLOAD_ERR_INI_SIZE | php.iniのupload_max_filesizeのサイズを超えている |
2 | UPLOAD_ERR_FORM_SIZE | HTMLフォームで指定された MAX_FILE_SIZE を超えている |
3 | UPLOAD_ERR_PARTIAL | 一部のみしかアップロードされていない |
4 | UPLOAD_ERR_NO_FILE | アップロードされなかった |
6 | UPLOAD_ERR_NO_TMP_DIR | サーバー一時保管フォルダがない |
7 | UPLOAD_ERR_CANT_WRITE | ディスクへの書き込みに失敗 |
8 | UPLOAD_ERR_EXTENSION | PHPの拡張モジュールがアップロードを中止した |
つまり今回はエラーコードが1
なので、「php.iniのupload_max_filesizeのサイズを超えている」エラーになります。そこで、php.iniの中身を確認してみると、アップロードできる単一ファイルの最大サイズが「2M」になっていました。
upload_max_filesize = 2M
今回はそこが原因だったので、以下のようにphp.iniファイルを編集して無事エラーが解消されました
upload_max_filesize = 5M
重要パラメータの説明
upload_max_filesize : アップロードできる単一ファイルの最大サイズを指定するパラメータ
post_max_size : POSTリクエスト全体(ファイルとフォームデータを含む)の最大サイズを指定するパラメータ
※post_max_size は常に upload_max_filesize 以上の値に設定することが推奨
おわりに
今回の問題は単純なPHP設定の制限によるものでしたが、ここにたどり着くまでに少々時間がかかってしまいました。今後は以下の点を意識していきたいと思います。この他なにか注意点などありましたらご教授いただけると大変ありがたいです。
- ファイルアップロードエラーが発生した場合は、まずエラーコードを確認する
- サーバー設定(php.ini)の確認は基本中の基本
- 設定を変更した場合は、必ずウェブサーバーを再起動して反映させる
最後までご覧いただきありがとうございました!