2011-06-21 18 views
5

tmpfile()tempnam()のようなtmpディレクトリにファイルを作成する関数に問題があります。それらはすべてtmpに書き込むのに失敗し、falseを返します。 upload_tmp_dirはphp iniに設定されており、ファイルのアップロードは正常に動作します。PHP tmpディレクトリが見つかりません

このエラーをデバッグすると、sys_get_temp_dir()は、残念ながら私のPHPバージョン(5.1.6)でサポートされていないtmpディレクトリの場所を取得することがわかりました。

if (!function_exists('sys_get_temp_dir')) { 
    function sys_get_temp_dir() { 
    if (!empty($_ENV['TMP'])) { return realpath($_ENV['TMP']); } 
    if (!empty($_ENV['TMPDIR'])) { return realpath($_ENV['TMPDIR']); } 
    if (!empty($_ENV['TEMP'])) { return realpath($_ENV['TEMP']); } 
    $tempfile=tempnam(__FILE__,''); 
    if (file_exists($tempfile)) { 
     unlink($tempfile); 
     return realpath(dirname($tempfile)); 
    } 
    return null; 
    } 
} 

しかし、そこに$ _ENV配列でtmpディレクトリへの参照がありませんし、私は前に述べたようにtempnam()が失敗した:私はまた、次のメソッドを使用してsys_get_temp_dir()の機能を置き換えことがわかりました。

またopen_basedirの私は同様の問題

を引き起こす可能性があります聞いたどの設定ではありませんどのように私はtmpディレクトリがどこにあるか、それがさえ設定されているかどうかを調べることができますか?
これはApacheサーバーの設定上の問題かPHPの問題ですか?あなたの助けのための

おかげで

+1

php.iniを確認してください。そこにディレクトリがあるはずです。 – Colum

+1

それは何と呼ばれるでしょうか?ありがとう – DonutReply

+0

異なる変数があります。私はupload_tmp_dirとsession.save_pathの下にディレクトリを見つけました。しかし、PHPのデフォルトは/ tmp – Colum

答えて

1

TMP、TEMP(そしておそらくTMPDIR)は、Windows上で有効であるだけであり、通常ポイC:\Windows\TEMPになります。 Linuxのデフォルトの一時的な場所は/tmpです。この問題を回避するには(tempnam()の機能で動作します)、Webサイトスペースのどこかに一時フォルダを作成し、適切なアクセス許可を指定して、これを上記の機能の最初のパラメータとして渡します。

素晴らしい解決策ではありませんが、何も優れていません。

2

あなたのphp.iniのアップロードの一時ディレクトリを設定することができます - そのような 何かが動作するはずです:

upload_tmp_dir=/your-www/tmp/ 

また、場合にはあなたがPHPを編集することはできません.iniか、それは世界的にあなたがあなたのスクリプトの先頭でこれを使用することができます行うにはしたくない:

ini_set('upload_tmp_dir','/your-home-www/tmp/'); 
0
おそらく

ないクリーンしかし、これは私の古い5.1.6で動作しますが、インストールしてください。

function get_temp_path() { 
    static $path = null; 
    if ($path !== null) return $path; 
    $file = tmpfile(); 
    $meta = stream_get_meta_data($file); 
    fclose($file); 
    $path = dirname($meta['uri']); 
    return $path; 
} 
0

私は同じ問題を抱えているし、溶液がPHPにTEMP変数を公開するためのApacheの設定を変更することで、this postを参照してください。

0

私のような初心者のためのヒント:私はPHPが私の一時フォルダからものを移動することができなかったと思ったが、私はちょうどフォルダの相対的な位置のために混乱していた。これは他の人にも当てはまる可能性があるので、私はこの特定の質問に非常に接して関連しています(この特定の質問は初心者の私のような他の人の検索結果であるためです)。

私の問題は、uploadformを呼び出した/ var/www/html/user /の/ var/www/html/profile.phpファイルの中のfunctions.phpファイルからアップロードフォームをエコーし​​ていたことです。/var/www/html /にあるphpファイル。アップロードされたファイルは、最終的には/ var/www/html/uploadsに格納されます。これは最終的に、uploadphoto.phpとupload/in functions.phpへの私の参照の大部分がそれぞれ "../uploadphoto.php"または "../uploads/[etc.jpg"と書かれていることを意味しました。 html/user /(html/user/profile.phpにエコーコードが書き込まれた場所)からhtml /に戻ってください。これにより、uploadphotoの中で以下のコマンドを直感的に使用することができました。PHPを介してそれを考えずに:

move_uploaded_file($_FILES["file"]["tmp_name"][0], "../uploads/$filename") 

を参照してください? uploadphoto.phpはuploadsと同じディレクトリにありますので、私は../ここは必要ありませんでした。数時間にわたり、私は画像のアップロードを初めて行ったので、私は再びフォルダのアクセス許可を乱していたと確信していました。もっと単純な誤りをチェックするのを忘れてしまった。うまくいけば、これは他の誰かを助けるでしょう

関連する問題