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

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

ただいまの
回答率

87.78%

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 972

score 5

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

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

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

~省略~
<form action="index.php" method="post" enctype="multipart/form-data">
    <input type="file" name="image"><br>
    <button type="submit">保存ボタン</button>
</form>
~省略~
~省略~
    $folder = './test/';
    $fileName = $_FILES['image']['name'];

    if (!empty($fileName)) {
        $ext = substr($fileName, -3);
        if (strcasecmp($ext, 'jpg')!=0 && strcasecmp($ext, 'gif')!=0 && strcasecmp($ext, 'png')!=0 && strcasecmp($ext, 'bmp')!=0) {
            $error['image'] = 'type';
        }
    }

    if (empty($error)) {
        $image = date('YmdHis') . $_FILES['image']['name'];
        $filepath = $folder.$image;
        var_dump($_FILES['image']['tmp_name']); //検証用
        move_uploaded_file($_FILES['image']['tmp_name'], $filepath);
    } 
~省略~

上記のプログラムを実行すると、
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である場合どのように行えばいいのか分かりませんでした。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

check解決した方法

0

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

とあります。

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/05/20 21:16

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

    キャンセル

  • 2020/05/20 21:44

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

    キャンセル

  • 2020/05/25 16: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である場合どのように行えばいいのか分かりませんでした。

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る