ファイルアップロード時に、$_FILE[~]["tmp_name"]に値が入らない - PHPプロ!Q&A掲示板

1448

  • 0P

ファイルアップロード時に、$_FILE[~]["tmp_name"]に値が入らない

質問日時 / 2008年8月29日 10:40 (最終編集:8月29日 10:47)    回答数 / 10件

Questioner:  awus787b  このエントリーをはてなブックマークに追加 

キーワード / $_FILE    アップロード    tmp_name   

初めて質問させていただきます。

PHP5.2.6で、フォームからファイルをアップロードしようとしているのですが、表題の通り、
サーバ内での一時ファイルの名前を表す$_FILE[~]["tmp_name"]に値が入らず、
アップロードが出来ない状態に陥っています。

以下、実際のソースの一部です。
  1. ▼ファイル選択画面のソース(input.tpl)
  2. <form action="./upload.php" method="post" enctype="multipart/form-data">
  3.  <p>
  4.   <input type="file" name="file_name" size="50" style="height:22px;"><br>
  5.   <input type="submit" value="&nbsp;&nbsp;アップロード&nbsp;&nbsp;">
  6.  </p>
  7. </form>

  1. ▼アップロード処理部分(upload.php)
  2. var_dump($_FILES[file_name]);
  3. if(isset($_FILES[file_name])){
  4.  move_uploaded_file( $_FILES[file_name]["tmp_name"], (移動先ディレクトリ)."filename.csv" );
  5. }

途中、$_FILESの内容をvar_dump();で表示させていますが、その内容は下記の通りです。
  1. array(5) { 
  2. ["name"]=> string(14) "(ファイル選択画面で選択したファイル名)" 
  3. ["type"]=> string(0) "" 
  4. ["tmp_name"]=> string(0) "" 
  5. ["error"]=> int(6) 
  6. ["size"]=> int(0) 
  7. }

事前にこの現象について調べたところ、php.iniでの設定・httpd.confでの設定が関連すると言うことなので、各種設定情報ならびにphpinfo()での表示を以下に記します。

  1. ▼php.iniのupload_tmp_dir
  2. ;upload_tmp_dir =

  1. phpinfo()での各種情報
  2. file_uploads:On
  3. upload_max_filesize:2M
  4. upload_tmp_dir:no value

※『解明するにはこの情報が足りない』などありましたら、教えていただければ後ほど用意いたします。

これらのことから、アップロードできない原因、$_FILES[file_name]["tmp_name"]に値が入らないがわかりますでしょうか。
よろしくお願いいたします。


ツリー一覧

┗A01yakou850$_FILES['file_name']['error']をみるとエラーコード
 ┗A01-1awus787byakou850様 回答ありがとうございます。 >「' '
  ┗A01-1-1yakou850> 試しに、$_FILES[file_name]を $_FILES['file_name'
   ┣A01-1-1-1awus787b>yakou850様 度々の回答、ありがとうございます。
   ┃┗A01-1-1-1-1awus787bこの意見は質問者によって削除されました。
   ┗A01-1-1-2awus787b>yakou850様 重ねて質問させていただきます。 >
    ┗A01-1-1-2-1yakou850エラー内容から推測すると 「一時ファイルは『デフ
     ┗A01-1-1-2-1-1awus787bホスティング会社から回答が来ました。 >php.ini
      ┗A01-1-1-2-1-1-1yakou850設定できるんですね。よかったです。 ちょっと自分も
       ┗A01-1-1-2-1-1-1-1awus787bphp.iniを作成して、試した結果を報告します。 >>C
        ┗A01-1-1-2-1-1-1-1-1awus787b解決いたしました。 ホスティング会社が指示したデ

回答一覧

並び替え:

A01
answereryakou850 [8月29日 10:49]

$_FILES['file_name']['error']をみるとエラーコード:6になっています。
その内容を調べると「テンポラリフォルダがありません。」ということで・・・。
http://jp.php.net/manual/ja/features.file-upload.errors.php

余談ですが
$_FILES[file_name] は実際には値が取れると思いますが、「' '」や「" "」でくくっていないので
file_nameという定数を探しにいって、みつからなかったので通常の文字列として使えています。
たしかnoticeのエラーメッセージが本来発行されているので
「' '」や「" "」でくくってきちんと文字列に扱えるように癖をつけたほうがいいと思います。

この意見に回答する

ツリーへ TOPへ

A01-1
replyerawus787b [8月29日 11:09] (最終編集:8月29日 11:24)

yakou850様
回答ありがとうございます。

>「' '」や「" "」でくくってきちんと文字列に扱えるように癖をつけたほうがいいと思います
試しに、$_FILES[file_name]を $_FILES['file_name']、$_FILES["file_name"]に変えてみましたが、やはりアップロードできず、var_dump()での表示内容にも変化はありませんでした。

>その内容を調べると「テンポラリフォルダがありません。」ということで・・・。
教えていただいたURLも参照済みでして、『upload_tmp_dirが設定されていない場合は、サーバのデフォルトのフォルダ内に一時ファイルが格納される』と言う記述もどこかのサイトで見た記憶があります。
ですが、この『サーバのデフォルトのフォルダ』と言うのがどこになるのか解りません。

ちなみに、ローカル環境でも全く同じ設定で、ローカルではアップロードは上手くいきます。
解りづらいかもしれませんが、フォルダ構成はこうなっています。

上位フォルダ
 ├ tmpフォルダ(一時ファイルが格納される)
 ├ input.tpl
 └ moduleフォルダ(処理ファイルを格納)
   └ upload.php

この場合、tmpフォルダが『サーバのデフォルトのフォルダ』になると思うのですが、あってますでしょうか。

この意見に回答する

ツリーへ TOPへ

A01-1-1
replyeryakou850 [8月29日 11:34]

> 試しに、$_FILES[file_name]を $_FILES['file_name']、$_FILES["file_name"]に変えてみましたが、変化はありませんでした。
たぶん変化は見えないと思います。
  1. ini_set('display_errors', 1);
  2. error_reporting(E_ALL);
といったコードをいれるとnoticeのエラーメッセージが表示されるはずなので
その際にエラーがでるかでないかの違いです。
環境によってはnoticeも画面に出力するサーバもありますので念のため。

>この『サーバのデフォルトのフォルダ』と言うのがどこになるのか解りません。
自分も明確にはお答えできません。OSによってもサーバの設定によっても異なると思います。
多くのLinuxサーバは/tmpだったりした記憶があります。
Windowsは・・・わかりません。ごめんなさい


あわせて調べてみましたが「upload_tmp_dir」をプログラムから設定すれば解決できるかと思えば
これも無理そうですね・・・。
http://jp.php.net/manual/ja/ini.core.phpをみると
upload_tmp_dirの「変更の可否」がPHP_INI_SYSTEMということで
「php.ini または httpd.confで設定可能なエントリ」になります。
レンタルサーバやなんかだと設定ができない項目ですね。
# 参考:http://jp.php.net/manual/ja/ini.php
php.iniの設定を変えられる権限をお持ちならば対処できるかもしれないです。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1
replyerawus787b [8月29日 12:02]

>yakou850様
度々の回答、ありがとうございます。

>コードをいれるとnoticeのエラーメッセージが表示されるはずなので
>その際にエラーがでるかでないかの違いです。
単に処理の内容・var_dump()での表示が変わるというわけではないのですね。
失礼いたしました。


>upload_tmp_dirの「変更の可否」がPHP_INI_SYSTEMということで
>「php.ini または httpd.confで設定可能なエントリ」になります。
>レンタルサーバやなんかだと設定ができない項目ですね。
>php.iniの設定を変えられる権限をお持ちならば対処できるかもしれないです。 
レンタルサーバを使っていまして、php.iniを変えられる権限を持っていないので、
ホスティング会社にこの件について聞いてみたいと思います。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1
replyerawus787b [8月29日 14:33]

この意見は質問者によって削除されました。

ツリーへ TOPへ

A01-1-1-2
replyerawus787b [8月29日 12:38]

>yakou850様
重ねて質問させていただきます。

>自分も明確にはお答えできません。OSによってもサーバの設定によっても異なると思います。
>多くのLinuxサーバは/tmpだったりした記憶があります。
『デフォルトのフォルダ』が実際にどこにあるかはともかくとして、
今の状態だと、一時ファイルは『デフォルトのフォルダ』に格納されている、と言うことなのでしょうか。

この意見に回答する

ツリーへ TOPへ

A01-1-1-2-1
replyeryakou850 [8月29日 12:48]

エラー内容から推測すると

「一時ファイルは『デフォルトのフォルダ』に格納しようとしたが
その設定がみつからないor設定はされているが指定の場所にフォルダがない」

などで保存できなかったなどという現象になっているかと思います。

この意見に回答する

ツリーへ TOPへ

A01-1-1-2-1-1
replyerawus787b [8月29日 14:34]

ホスティング会社から回答が来ました。

>php.ini の追加指定が可能です。
>php.ini ファイルをご利用領域のトップに置いてください。
>このファイルに記述された内容はデフォルトのphp.ini に追加されます。
>デフォルトと重複する記述はこのファイルの記述が優先されます。
>しかし、デフォルトでインストールされていないオプションについての記述は無効です。

どうやら設定可能のようなので、試してみて結果を書こうと思います。
この場合、サーバのルートからtmpフォルダまでの絶対パスで指定すればいいのでしょうか。

この意見に回答する

ツリーへ TOPへ

A01-1-1-2-1-1-1
replyeryakou850 [8月29日 15:27]

設定できるんですね。よかったです。
ちょっと自分もなったことのない現象でして・・・。

>サーバのルートからtmpフォルダまでの絶対パスで指定すればいいのでしょうか。
そうですね。そうすべきだと思います。

この意見に回答する

ツリーへ TOPへ

A01-1-1-2-1-1-1-1
replyerawus787b [9月1日 18:21]

php.iniを作成して、試した結果を報告します。

  1. ▼php.iniの内容
  2. file_uploads = On(元々のphp.iniの設定と変わりなし)
  3. upload_max_filesize = 2M(元々のphp.iniの設定と変わりなし)
  4. upload_tmp_dir = ./www/htdocs/online/admin/tmp(相対パスの場合)
  5.  
  6. ※絶対パスの場合でも試しました
  7. upload_tmp_dir = /usr/home/(サーバ名)/www/htdocs/online/admin/tmp

元々のphp.iniを上記のように編集して、php.iniを設定してみましたが、
やはり$_FILE[~]["tmp_name"]に値が入らず、エラーが出てしまいました…
phpinfo()での表示も、"upload_tmp_dir"の値がlocalの欄に反映されず『no value』のままでした。
フォルダまでのパスは、SSHで該当フォルダ(tmp)に行ってからPWDコマンドで表示されたものをコピーしたので、間違えてはいないはずです。
(該当フォルダ(tmp)のパーミッションは777です)

これでエラーが出てしまうというとことは、何か基本的なことを見落としているかもしれないので、どなたか下記の質問に答えてもらえますでしょうか。
(中にはPHPの質問かどうか微妙なものもありますが…)

phpinfo()の表示で、『file_uploads = On』であればファイルアップロードは可能である?
●php.ini変更後にはapache再起動をしなくても反映される?
●該当フォルダ(tmp)のパーミッションが777ならば、そのフォルダのユーザが誰であろうと、アクセス可能である?

よろしくお願いします

この意見に回答する

ツリーへ TOPへ

A01-1-1-2-1-1-1-1-1
replyerawus787b [9月2日 11:57]

解決いたしました。

ホスティング会社が指示したディレクトリにphp.iniを置いて試していたのですが、
後日、指示した場所が間違っていたとホスティング会社から連絡がありました。

正しい場所にphp.iniを置いて試したところ、アップロードが出来ました。
(パスは絶対パスで指定、該当フォルダ(tmp)のパーミッションは777で動作しました)

助言を下さった方々、ありがとうございました。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
セッションがいいのか、それともデータベースがいいのか教えて下さい。
 このエントリーをはてなブックマークに追加 
A
>ボタンをクリックしたら選んだ商品情報を持っておきたいと思っています。 そのくらいのことならセッションもしくはCookie(期限短め:場合によってはブラウザ閉じるまで)でいいんじゃないですかね。 #わ...

>>続きを読む

一つの目安として、ECサイトの購入情報など絶対に消えてはいけないものはDBに、カートなどの一時的に使用する情報や、ユーザに任意のタイミングで消去されても構わないものはセッションにと使い分けるといいでしょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)