質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

0回答

1760閲覧

move_uploaded_file()処理時のエラー解決策について

Ryota.I

総合スコア22

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2020/01/03 03:20

編集2020/01/04 04:46

お世話になっております。
兼ねてより制作中のWEBサイトで画像の保管をする際に使用している
move_uploaded_file()で下記エラーの解消がしきれず困っております。

ErrorMessage

1Warning (2): move_uploaded_file(webroot/files/Ices/image_file/20200103113922DSC_0002.JPG): failed to open stream: No such file or directory [APP/Controller/IcesController.php, line 119] 2Warning (2): move_uploaded_file() [<a href='https://secure.php.net/function.move-uploaded-file'>function.move-uploaded-file</a>]: Unable to move '/tmp/php6xMSmE' to 'webroot/files/Ices/image_file/20200103113922DSC_0002.JPG' [APP/Controller/IcesController.php, line 119] 3Warning (512): Unable to emit headers. Headers sent in file=/home/ec2-user/environment/my_pt_lesson/vendor/cakephp/cakephp/src/Error/Debugger.php line=853 [CORE/src/Http/ResponseEmitter.php, line 51] 4Warning (2): Cannot modify header information - headers already sent by (output started at /home/ec2-user/environment/my_pt_lesson/vendor/cakephp/cakephp/src/Error/Debugger.php:853) [CORE/src/Http/ResponseEmitter.php, line 152] 5Warning (2): Cannot modify header information - headers already sent by (output started at /home/ec2-user/environment/my_pt_lesson/vendor/cakephp/cakephp/src/Error/Debugger.php:853) [CORE/src/Http/ResponseEmitter.php, line 185] 6Warning (2): Cannot modify header information - headers already sent by (output started at /home/ec2-user/environment/my_pt_lesson/vendor/cakephp/cakephp/src/Error/Debugger.php:853) [CORE/src/Http/ResponseEmitter.php, line 185] 7Warning (2): Cannot modify header information - headers already sent by (output started at /home/ec2-user/environment/my_pt_lesson/vendor/cakephp/cakephp/src/Error/Debugger.php:853) [CORE/src/Http/ResponseEmitter.php, line 185]

▽エラー発生時に取得できている内容(一部抜粋です)▽
※line 119の取得内容の一部

line119ofProcessB

1$file = [ 2 'tmp_name' => '/tmp/php6xMSmE', 3 'error' => (int) 0, 4 'name' => 'DSC_0002.JPG', 5 'type' => 'image/jpeg', 6 'size' => (int) 170153 7] 8$filePath = 'webroot/files/Ices/image_file/20200103113922DSC_0002.JPG' 9$size = (int) 170153 10$ext = 'image/jpeg'

上記情報取得時のコード(下記IcesController全体のコード中"処理B"の部分)

PHP

1 move_uploaded_file($_FILES['image_file']['tmp_name'], $filePath); 2         ※↑line119がここになります

エラーメッセージの内容から、本サイト、他のネット記事を参考に、
"パスの指定方法の誤り"が大方の原因であることはある程度理解できたため、
自身の環境にあわせ指定をしたところ、一旦は解決できました(パスの記載内容は丁度この内容で解決してました)。
ただ、その後、少し時間をあけてから同様の操作をすると、
同じエラーが出てしまいます。その根本の解決策の模索中です。

▽環境▽
AWS Cloud9:無料枠
MySQL:ver5.7.26
CakePHP:ver3.8.2
PHP:ver7.2.19
※以前の質問記事(https://teratail.com/questions/230485)から大きく変更した点
A:画像投稿はmove_uploaded_file()で処理(今回はこの部分についてのご相談です)
B:以前使用していたプラグイン"FriendsOfCake/cakephp-upload"は無効化
C:画像データ自体はAmazon S3へ保管(他はMySQLへ)

▽"AWS Cloud9:無料枠"のディレクトリ構成です▽
※"image_fileフォルダ"の直下に画像データが入っていました。
※move_uploaded_file()を使用してから下記ディレクトリ構成に変更はありません。
イメージ説明

▽画像登録時のコード全体像(IcesController)▽

PHP

1public function add() 2 { 3 $ice = $this->Ices->newEntity(); 4 if ($this->request->is('post')) { 5 $ice = $this->Ices->patchEntity($ice, $this->request->getData()); 6 $file = $this->request->getData('image_file'); 7 $filePath = 'webroot/files/Ices/image_file/'.date("YmdHis").$file['name']; 8 //特定の拡張子かつ800KB未満でないとアップできないようにする 9 $size = $file['size'];//容量を取得 10 $ext = $file['type'];//拡張子を取得 11 if($ext ==='image/jpg' && $size < 819200)//処理A 12 { 13 $file = $this->request->getData('image_file'); 14 $filePath = 'webroot/files/Ices/image_file/'.date("YmdHis").$file['name']; 15 move_uploaded_file($_FILES['image_file']['tmp_name'], $filePath);//Storage to directry to photo data. 16 }elseif($ext ==='image/jpeg' && $size < 819200){//処理B 17 $file = $this->request->getData('image_file'); 18 $filePath = 'webroot/files/Ices/image_file/'.date("YmdHis").$file['name']; 19 move_uploaded_file($_FILES['image_file']['tmp_name'], $filePath); 20 }elseif($ext ==='image/png' && $size < 819200){//処理C 21 $file = $this->request->getData('image_file'); 22 $filePath = 'webroot/files/Ices/image_file/'.date("YmdHis").$file['name']; 23 move_uploaded_file($_FILES['image_file']['tmp_name'], $filePath); 24 }elseif($ext ==='image/gif' && $size < 819200){//処理D 25 $file = $this->request->getData('image_file'); 26 $filePath = 'webroot/files/Ices/image_file/'.date("YmdHis").$file['name']; 27 move_uploaded_file($_FILES['image_file']['tmp_name'], $filePath); 28 }else{//処理E 29 $this->Flash->error(__('種類はjpg,jpeg,png,gif,サイズは800KBまでで登録をお願いします')); 30 return $this->redirect(['controller' => 'ices', 'action' => 'add']); 31 } 32 $data = array( 33 'manufacturer' => $this->request->getData('manufacturer'), 34 'ice_name' => $this->request->getData('ice_name'), 35 'ice_fraver' => $this->request->getData('ice_fraver'), 36 'price_no_tax' => $this->request->getData('price_no_tax'), 37 'buy_year' => $this->request->getData('buy_year'), 38 'buy_month' => $this->request->getData('buy_month'), 39 'simple_comment' => $this->request->getData('simple_comment'), 40 'desc_comment' => $this->request->getData('desc_comment'), 41 'image_file' => date("YmdHis") . $file['name'], 42 'repeat_rate' => $this->request->getData('repeat_rate'), 43 'stock_rate' => $this->request->getData('stock_rate'), 44 ); 45 $ice = $this->Ices->newEntity($data); 46 $ice->user_id = $this->Auth->user()['id']; 47 if ($this->Ices->save($ice)) {//Storage to DB 48 //to AWSs3[upload] 49 // if(isset($ice)){ 50 // $this->setAction('upload',$ice); 51 // }; 52 $this->Flash->success(__('アイスの登録ができました'),['key' => 'positive']); 53 return $this->redirect(['controller' => 'users', 'action' => 'view', $this->Auth->user()['id']]); 54 } 55 $this->Flash->error(__('アイスの登録ができませんでした')); 56 } 57 //一部略 58}

・アップロード対象の画像ファイルの拡張子、容量を元に処理A~Eに分けられるように記述し、
アップロードができるようになるまでに使用したファイルが"処理B"に振られたため、
そこでパスの調整をし、できるようになったのが、下記の記載でした。

$filePath = 'webroot/files/Ices/image_file/'.date("YmdHis").$file['name'];

・その後、他の想定ファイルでもアップできることを確認し、
記載内容や作業環境の整理の一環とし、下記の作業を行っています。
1、//debug();や、他の不要なコメントアウトの削除。
2、不要な空行をCtrl+Deleteで詰める
3、image_fileに収納された画像データの削除
4、phpMyAdminより検証で増えたレコードを一括削除
5、$filePath = 'webroot/files/Ices/image_file/'.date("YmdHis").$file['name'];を処理A~Eまでに記述

...といった内容ですが、どこか今回のエラーに繋がる要因があるのでしょうか。
また、そもそものパスの指定方法自体も、改めて勉強中ですが、
画像投稿処理ができた時点のコードをそのまま保存し、
翌日に試しても同様のエラーが出る、といった状況がまばらに続いており、
困惑しているところもありますが、何か解決の糸口となるご提示を
していただけると非常に助かります。
お手数おかけしますが、どうぞご教示をお願いいたします。

▼以下、2020/1/4 追記分です▼
1/3にいただいたコメントより、公式ドキュメント
(https://book.cakephp.org/3/ja/core-libraries/file-folder.html)を
元に上記質問内容内"IcesController.php"の"//処理B"内を
下記のように書き換え実行すると、"image_file"ディレクトリの直下にファイルが
保存されることまでは確認ができました。
ただ、その"保存されるファイル"というのが、"size"が"0"となっており、
画像ファイルとして閲覧することはできない状態で保存されています。

---以下、書き換えた内容---
▽IcesController.phpの処理B内

php

1$time = Time::now('Asia/Tokyo'); //時刻をTokyoに指定し 2$time = $time->i18nFormat('yyyyMMddHHmmss');//時間取得 3$file = $this->request->getData('image_file'); //★A:ファイル情報取得 4$file = new File(WWW_ROOT.'/files/Ices/image_file/'.$time.$file['name']); 5$file->create();//★B:image_fileディレクトリへ新規ファイルとして画像ファイル作成 

この書き換えた内容の★Aのすぐ下でdebug($file);をした場合、
sizeは投稿しようとするファイルの容量を表示しています

[ 'tmp_name' => '/tmp/phplCeijU', 'error' => (int) 0, 'name' => 'DSC_0002.JPG', 'type' => 'image/jpeg', 'size' => (int) 170153 ]

また、★Bの下でdebug($file);してみると下記のように表示されています。

object(Cake\Filesystem\File) { Folder => object(Cake\Filesystem\Folder) { path => '/home/ec2-user/environment/my_pt_lesson/webroot/files/Ices/image_file' sort => false mode => (int) 493 [protected] _fsorts => [ 'name' => 'getPathname', 'time' => 'getCTime' ] [protected] _messages => [] [protected] _errors => [] [protected] _directories => null [protected] _files => null } name => '20200104130459DSC_0002.JPG' info => [] handle => null lock => null path => '/home/ec2-user/environment/my_pt_lesson/webroot/files/Ices/image_file/20200104130459DSC_0002.JPG' }

今の時点で容量も含めての保存処理が必要なことは検討がついているのですが、
どのように記述すればよいかというところで手詰まりな状態です。
保存処理の方針に対しての過不足、上記記述内容のお気づきの点等ありましたら、
改めてご教示いただけると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/01/03 04:05

相対パスでかかれてますが、その相対パスは何処から始まってるか確認できてますか?
m.ts10806

2020/01/03 04:14

そもそもCakePHPのファイルアップやフォーム送信の処理ってPHPの標準関数使いましたっけ? 何を参考に書いたコードですか?
Ryota.I

2020/01/03 04:21

asahina1979様 コメントありがとうございます。 filePath = 'webroot/files/Ices/image_file/20200103113922DSC_0002.JPG' ↑のパス部分については相対パスで記載していたという認識ももてないままでした。 (../../と..を記載すると”相対”、そうでない場合、”絶対”なのかな...くらいの認識でした) 逆に質問してしまうようで申し訳ないのですが。。。 1、相対パスであるなら.. "作業中の場所から、その指定したディレクトリまでを示す経路"という理解までは、 今の時点でしていますが、この認識はあってますか? 2、1の認識であっている場合、 "作業中の場所"とは、move_uploaded_file()を記載しているファイル=IcecController.phpのことでよいでしょうか? もし認識違いであったら申し訳ありません。。
Ryota.I

2020/01/03 04:23

※失礼しました。少し訂正させていただきます。記載した相対パスとは.. $filePath = 'webroot/files/Ices/image_file/'.date("YmdHis").$file['name']; ↑の内容のことでした。
Ryota.I

2020/01/03 04:50

asahina1979様 最新のverに加え、自身のverのドキュメントまで用意をしていただきありがとうございます。 加えての質問で申し訳ないのですが、 1、「標準関数」とはmove_uploaded_file()のことで、 2、それに変わる処理は、提示されたドキュメントのFolder&Fileの内容で記載する という理解でよいでしょうか。 上記の認識で間違いなければ、少し古いですが、 http://bashalog.c-brains.jp/14/06/10-150000.php の記事の内容も参考にしつつ、ver3.8での記述を模索していこうと思います。
退会済みユーザー

退会済みユーザー

2020/01/03 06:00

それは古いというより Cakephp 2.x での開発のだね
Ryota.I

2020/01/03 08:02

asahina1979様 確かに2系の記事でしたので、まだ調査中ではありますが自身の使用しているver3.8の中で使えるメソッドを擦り合わせて構築していきます。
Ryota.I

2020/01/03 08:08

m.ts10806様 一度、今回の画像投稿に関わるControllerの move_uploaded_file、 date()、 $_FILES、 上記三点はcakephp側ドキュメントに記載はなかったので、これらに変わる、本来のcakephpで使用できるメソッド、関数を探し、記載していきます。
Ryota.I

2020/01/04 04:13

先日はありがとうございました。 いただいた情報(https://book.cakephp.org/3/ja/core-libraries/file-folder.html)を 元に上記質問内容内"IcesController.php"の"//処理B"内を 下記のように書き換え実行すると、"image_file"ディレクトリの直下にファイルが 保存されることまでは確認ができました。 ただ、その"保存されるファイル"というのが、"size"が"0"となっており、 画像ファイルとして閲覧することはできない状態で保存されています。 ---以下、書き換えた内容--- $time = Time::now('Asia/Tokyo'); //時刻をTokyoに指定し $time = $time->i18nFormat('yyyyMMddHHmmss');//時間取得 $file = $this->request->getData('image_file'); //★A:ファイル情報取得 $file = new File(WWW_ROOT.'/files/Ices/image_file/'.$time.$file['name']); $file->create();//★B:image_fileディレクトリへ新規ファイルとして画像ファイル作成  ---書き換えた内容ここまで--- この書き換えた内容の★Aのすぐ下でdebug($file);をした場合、 sizeは投稿しようとするファイルの容量を表示しています [ 'tmp_name' => '/tmp/phplCeijU', 'error' => (int) 0, 'name' => 'DSC_0002.JPG', 'type' => 'image/jpeg', 'size' => (int) 170153 ] また、★Bの下でdebug($file);してみると下記のように表示されています。 object(Cake\Filesystem\File) { Folder => object(Cake\Filesystem\Folder) { path => '/home/ec2-user/environment/my_pt_lesson/webroot/files/Ices/image_file' sort => false mode => (int) 493 [protected] _fsorts => [ 'name' => 'getPathname', 'time' => 'getCTime' ] [protected] _messages => [] [protected] _errors => [] [protected] _directories => null [protected] _files => null } name => '20200104130459DSC_0002.JPG' info => [] handle => null lock => null path => '/home/ec2-user/environment/my_pt_lesson/webroot/files/Ices/image_file/20200104130459DSC_0002.JPG' } 今の時点で容量も含めての保存処理が必要なことは検討がついているのですが、 どのように記述すればよいかというところで手詰まりな状態です。 保存処理の方針に対しての過不足、上記記述内容のお気づきの点等ありましたら、 改めてご教示いただけると幸いです。
m.ts10806

2020/01/04 04:36

質問編集して追記してください
Ryota.I

2020/01/04 04:48

m.ts10806様。ご指摘ありがとうございます。 質問内容本文内に追記いたしました(そのためコメントに追記済みの本質問内容は削除リクエスト済みです)。 お手数をおかけしますが、もしよろしければ、改めてご確認、ご教示お願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問