PHP/Laravelで画像がアップロードできない不具合の対処について以下に示す。
#TL;DR
php.iniのupload_max_filesize
の上限サイズを変更する。
実装環境
- PHP 7.2.6
- Laravel 5.5.40
- CentOS 7
動作環境
- iPhone8
- iOS11.4
発生した問題
以下のような実装で画像ファイルのアップロードを行う際に画像ファイルがアップロードできない不具合が発生していた。
<form role="form" method="POST" action="{{ url('/image_converter') }}">
<input type="file" accept="image/*" name="image">
<input type="submit" value="送信する">
</form>
<?php
public function imageConverter($request)
{
$request = request->all();
if (!empty($request['image']) {
$imagick = new \Imagick();
$imagick->readImage(realpath($request['image']));
$imagick->autoOrient();
$imagick->setImageFormat('jpg');
$path = publicpath('/images/test.jpg');
$imagick->writeImage($path);
}
}
実行結果
以下のようなエラーが発生した
"message": "The path is a directory: /app/public",
"exception": "ImagickException",
更にアップロードされた画像ファイルの情報を確認すると、以下のような情報が確認できた
originalName: image.jpg
mimeType: application/octet-stream
size: 0
error 1
path: ""
basename: ""
pathname: ""
exception: ""
realpath: "/app/public"
原因
-
php.iniのupload_max_filesizeが2Mになっていた(デフォルト設定)
PC環境だと画像のサイズが2Mを超えないため、あまり関係はないが、スマホ(iPhone)だと撮った写真のサイズが2M以上超えることが多々あるため、デフォルトの設定では上記の情報のようにファイルが
application/octet-stream
になってしまう。
解決方法
php.iniのファイルのupload_max_filesize
を変更する
php.ini
; Maximum allowed size for uploaded files.
; http://php.net/upload-max-filesize
; ここのfilesizeを2M以上に変更する
upload_max_filesize = 2M
php.iniを変更したため、以下のコマンドを実行する
apacheの再起動
$ service httpd restart
php-fpmの再起動
$ service php-fpm restart