base64から写真ファイルを作ったものを保存する作業をしています。保存する際に拡張子が.binになってしまうところで作業が止まってしまいました。
解決したい事: 写真ファイルをstoreする時に拡張子を変更したいです(pngなどに)
現状: 写真ファイルをstoreすると.bin拡張子で保存されてしまいます。
$fileData = base64_decode($edit_base64); $tmpFilePath = sys_get_temp_dir() . '/' . Str::uuid()->toString(); file_put_contents($tmpFilePath, $fileData); $tmpFile = new File($tmpFilePath); $file = new UploadedFile( $tmpFile->getPathname(), $tmpFile->getFilename(), $tmpFile->getMimeType(), 0, true ); $path = $file->store('public'); //ここで.binで保存されてしまいます。 $extension = \File::extension($path); $read_temp_path = str_replace('public/', '/storage/', $path);
中身 $file => Illuminate\Http\UploadedFile {#1341 path: "/var/folders/kj/jv_tl7g96hg_ygkpyvkg96880000gn/T", filename: "0aa80174-79d6-4506-8e60-a45d2707336a", basename: "0aa80174-79d6-4506-8e60-a45d2707336a", pathname: "/var/folders/kj/jv_tl7g96hg_ygkpyvkg96880000gn/T/0aa80174-79d6-4506-8e60-a45d2707336a", extension: "", realPath: "/private/var/folders/kj/jv_tl7g96hg_ygkpyvkg96880000gn/T/0aa80174-79d6-4506-8e60-a45d2707336a", aTime: 2020-09-24 12:42:11, mTime: 2020-09-24 12:42:11, cTime: 2020-09-24 12:42:11, inode: 24929845, size: 118387, perms: 0100644, owner: 501, group: 20, type: "file", writable: true, readable: true, executable: false, file: true, dir: false, link: false, } $path => "public/TVOMOexr5O5SLZih17pCW5iljss1FAjKpOC4IPsH.bin" $extension => "bin" $read_temp_path => "/storage/TVOMOexr5O5SLZih17pCW5iljss1FAjKpOC4IPsH.bin"
元の写真はpng拡張子です。
$fileのextensionを調整するのか、phpのimagepngなどを使っていくのでしょうか?
storeする際に拡張子を変更するにはどの様な処理を書けば良いのか見つけられずに止まってしまいました。
お分かりになる方、参考になるものを知っている方、ご教授お願いしたいです。
よろしくお願いいたします。
laravel7.x
php 7.4.8
調べたサイト
https://www.php.net/manual/ja/function.imagepng.php
https://qiita.com/naoqoo2/items/029d1761f48d5e739dd6
追記
ここを参考にimagecreatefromstring($fileData)を実行しましたが、下記の様に表示されてしまいます。
PHP Warning: imagecreatefromstring(): Data is not in a recognized format in Psy Shell code on line 3 => false
状態としてはこちらと似ているのではと考えています。
追記2
storeAs()でファイル名を指定して保存してみましたが、拡張子は変更され保存されるも表示すると空判定です。
$path = $file->storeAs('public', 'example.png'); 下記でもpngで保存できますが、表示できません。 $file_store_file_name =$tmpFile->getFilename().".png"; $path = $file->storeAs('public', $file_store_file_name);
追記3
Mineタイプが本来は"image/png"になって欲しいんですが、今の状態だとファイルの情報が分かってないっぽいです。
参考
$tmpFile->getMimeType() => "application/octet-stream"
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。