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

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

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

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

Q&A

解決済

3回答

5695閲覧

PHPで画像がtmpへアップロードされません

TTYTT

総合スコア9

PHP

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

0グッド

1クリップ

投稿2020/05/20 10:42

編集2020/05/25 07:24

PHPで画像をサーバーへ保存するプログラムを作成しておりますが、tmpフォルダへアップロードされていないのか上手くいきません。

環境
Buffalo製NASの「Webサーバー」という機能をオンにして、ローカルサーバーとして使用しております。
PHPバージョン 5.3.23
Windows10

該当のPHPファイルと同じ階層に「test」というフォルダを作成し、そこにアップロードするjpg画像を入れております。
また、保存先も「test」フォルダに設定しております。

html

1~省略~ 2<form action="index.php" method="post" enctype="multipart/form-data"> 3 <input type="file" name="image"><br> 4 <button type="submit">保存ボタン</button> 5</form> 6~省略~

PHP

1~省略~ 2 $folder = './test/'; 3 $fileName = $_FILES['image']['name']; 4 5 if (!empty($fileName)) { 6 $ext = substr($fileName, -3); 7 if (strcasecmp($ext, 'jpg')!=0 && strcasecmp($ext, 'gif')!=0 && strcasecmp($ext, 'png')!=0 && strcasecmp($ext, 'bmp')!=0) { 8 $error['image'] = 'type'; 9 } 10 } 11 12 if (empty($error)) { 13 $image = date('YmdHis') . $_FILES['image']['name']; 14 $filepath = $folder.$image; 15 var_dump($_FILES['image']['tmp_name']); //検証用 16 move_uploaded_file($_FILES['image']['tmp_name'], $filepath); 17 } 18~省略~

上記のプログラムを実行すると、
var_dump($_FILES['image']['tmp_name']) の結果が string(0) "" と表示されます。
「test」フォルダにも画像が保存されていません。

5MB程度の画像ファイルですが、ファイルサイズなどで引っ掛からないよう、php.iniも以下の値に書き換えております。
max_execution_time 600
upload_max_filesize 256M
post_max_size 288M
memory_limit 512M

そのため、そもそもtmpフォルダへ保存されていないと思い色々と検索しましたが、理由が分かりませんでした。

NASの機能でサーバーを作成した時点で、指定した共有フォルダにhtdocs, cgi-bin, logというフォルダがそれぞれ作成されましたが、
tmpフォルダらしきフォルダはどこを確認しても見当たらないため、エクスプローラーからは見えない場所にあるのでしょうか。
php.iniのupload_tmp_dirを確認したところ初期値が空欄になっており、他の項目で”/tmp”と記述されている箇所があったため、同じように”/tmp”としました。

エクスプローラーで“/tmp“の場所を表示できないため、フォルダが存在するかの確認やパーミッションの確認なども出来ません。

tmpフォルダをNASの共有フォルダ内のhtdocs, cgi-bin, logと同じ階層に設定するのが一番良いのですが、php.iniにどのようなパスを表記すれば共有フォルダ内に指定できるのか、調べても見つけることができませんでした。

この状態で何かお判りでしょうか。宜しくお願い致します。

-----------------------------追記(2020/05/25)-------------------------------

phpinfoに_SERVER["DOCUMENT_ROOT"]という項目があり、そこに/mnt/array1/共有フォルダ名/htdocsと表記があったため、
php.iniのupload_tmp_dirを/mnt/array1/共有フォルダ名/tmpとしました。

その状態で再度実行しましたが、アップロードできませんでした。
phpファイルに
echo $_FILES['image']['error'];
という行を入れて検証したところ、戻り値が1(UPLOAD_ERR_INI_SIZE)であったため、試しにファイルサイズが3KB程度の画像で実行してみると上手く動作しました。

php.iniでupload_max_filesize = 256M と指定したはずなので、5MB程度の画像ファイルがサイズエラーとなるのはおかしいと思いphpinfoを確認したところ、そもそもLocal ValueとMaster Valueがどちらもデフォルトの値になっており、upload_max_filesizeやupload_tmp_dirもデフォルトの値のままでした。php.iniには設定した値が保存されております。

php.ini編集後にNASの再起動と「Webサーバー」機能のオフ・オンは実行しておりますが、それだけでは反映されないのでしょうか。検索するとApacheの再起動が必要という情報が見られますが、対象がNASである場合どのように行えばいいのか分かりませんでした。

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

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

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

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

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

guest

回答3

0

php.iniを初期状態に戻し、再度php.iniの値を変更し直したところ、変更内容が反映され問題なくアップロードすることが出来るようになりました。
デフォルトのphp.iniをコピーして値のみを書き換えて使用していたつもりでしたが、書式がどこかで間違ってしまったのかもしれません。お騒がせしました。

投稿2020/05/27 05:35

TTYTT

総合スコア9

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

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

0

自己解決

php.iniを初期状態に戻し、再度php.iniの値を変更し直したところ、変更内容が反映され問題なくアップロードすることが出来るようになりました。
デフォルトのphp.iniをコピーして値のみを書き換えて使用していたつもりでしたが、書式がどこかで間違っていたのかもしれません。お騒がせしました。

投稿2020/05/27 05:33

編集2020/05/27 05:36
TTYTT

総合スコア9

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

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

0

PHP: POST メソッドによるアップロード - Manual によると

php.ini の upload_tmp_dir ディレクティブで 他の場所を指定しない限り、ファイルはサーバーにおけるデフォルトの テンポラリディレクトリに保存されます。サーバーのデフォルトディレクトリは、 PHP を実行する環境において環境変数 TMPDIR を設定する ことにより変更することができます。しかし、PHP スクリプトの内部から putenv() 関数により設定しても上手くいきません。 この環境変数は、アップロードされたファイルに他の処理を行う際にも 同様に使用することが可能です。

とあります。

NAS にデフォルトの テンポラリディレクトリが存在するのかは、マニュアル等で調べてみてください。

逆に自分でアップロード用のディレクトリを作成して、パーミッションを適切にして、php.ini で upload_tmp_dir を設定してしまうというのも一つの手かもしれません。

投稿2020/05/20 11:05

Yasumichi

総合スコア1773

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

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

TTYTT

2020/05/20 12:00

ご回答頂き大変ありがとうございます。 マニュアル等も確認しましたが、役に立つ情報は載っておりませんでした。 自分でupload_tmp_dirに任意のフォルダを設定する方法も既に試しておりますが、エクスプローラーで見えている共有フォルダを指定するパスが調べても分からないため、手詰まりの状態です…。
Yasumichi

2020/05/20 12:07

Buffalo製NAS の細かい型番とかは提示できない感じですかね?
TTYTT

2020/05/20 12:16

TeraStationシリーズのTD1400Dという製品です。 こちらの「Webサーバー」という機能をオンにして使用しております。
Yasumichi

2020/05/20 12:44

phpinfo とかでパスを類推できませんかね?
TTYTT

2020/05/25 07:20

phpinfoに_SERVER["DOCUMENT_ROOT"]という項目があり、そこに/mnt/array1/共有フォルダ名/htdocsと表記があったため、 php.iniのupload_tmp_dirを/mnt/array1/共有フォルダ名/tmpとしました。 その状態で再度実行しましたが、アップロードできませんでした。 phpファイルに echo $_FILES['image']['error']; という行を入れて検証したところ、戻り値が1(UPLOAD_ERR_INI_SIZE)であったため、試しにファイルサイズが3KB程度の画像で実行してみると上手く動作しました。 php.iniでupload_max_filesize = 256M と指定したはずなので、5MB程度の画像ファイルがサイズエラーとなるのはおかしいと思いphpinfoを確認したところ、そもそもLocal ValueとMaster Valueがどちらもデフォルトの値になっており、upload_max_filesizeやupload_tmp_dirもデフォルトの値のままでした。php.iniには設定した値が保存されております。 php.ini編集後にNASの再起動と「Webサーバー」機能のオフ・オンは実行しておりますが、それだけでは反映されないのでしょうか。検索するとApacheの再起動が必要という情報が見られますが、対象がNASである場合どのように行えばいいのか分かりませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問