web-dev-qa-db-ja.com

PHPファイルのアップロード、move_uploaded_filesの前に/ tmpからファイルが消える

私は非常に基本的なアップロードスクリプトを持っています。おそらくphp.net/move_upload_files関数ページから直接持ち上げられています。

move_uploaded_file()は、tmpフォルダーでtmpファイルが見つからないため失敗しました。しかし、私はそれがそこに置かれていることを知っていますが、move_upload_file()が私のスクリプトでそれを処理する前に削除されています。大きなファイルがサーバーに投稿されているときにそこにファイルが表示されるので、そこに配置されていることがわかります。

また、_$_FILES_には、アップロードしたばかりのファイルの正しい詳細が含まれています。

一時ファイルを処理する前に、一時ファイルが/ tmpから削除される理由を誰かが知っていましたか?

これが私が使っている基本的なコードです。

_if(move_uploaded_file($_FILES['userfile']['tmp_name'], $upload_file))
{
    $result['error'] = 'false';
    $result['file_loc'] = $upload_file;
}
else
{
    $result['error'] = 'true';
}
_

print_r($_FILES)の出力は次のようになります

_[userfile] => Array
(
    [name] => switchsolo.png
    [type] => image/png
    [tmp_name] => /tmp/phpIyKRl5
    [error] => 0
    [size] => 6690
)
_

しかし、/ tmp/phpIyKRl5は単にそこにありません。

15
Bowen

1)post_max_sizeとupload_max_filesizeは、アップロードしようとしているファイルのサイズよりも高い値を保持していますか?

2)アップロードスクリプトの実行に、max_execution_time変数の値よりも長い時間がかかりますか?

3)アップロードスクリプトはmemory_limit変数が許可するほど多くのメモリを消費しないと思います。クライアントがファイルをサーバーにアップロードしているとき、サーバーはファイルの一部をメモリに保持している可能性があります。 php.iniのmemory_limit変数の制限に何らかの影響があるかどうかはわかりません。

これらの変数は、php.iniや.htaccess、またはini_set()で変更できます。

お役に立てば幸いです。

スクリプトの実行が終了すると、ファイルは削除されます。スクリプトを実行してから/ tmp /フォルダーを確認すると、ファイルは何があってもそこにありません。

6
Joel L

私は試していました http://www.w3schools.com/php/php_file_upload.asp そして私は同じバグに出くわしました。

私の場合、$ destinationの前に「./」を追加すると問題が解決しました。

bool move_uploaded_file ( string $filename , string $destination )

私もこの問題を抱えていましたが、解決策を求めてこのWebサイトに出くわしました-うまくいきませんでした;)

print_r($_FILES)を表示すると正しい情報が得られましたが、move_uploaded_file ..を実行できませんでした。

$upload_file関数のmove_uploaded_fileパス属性をチェックすることで問題を解決しました-それが正しいことを確認してください。そうでない場合は機能しません(私のものは正しくありませんでした)。

また、一時的な場所にあるファイルは自動的に削除されます。これがPHPの仕組みだと思います。

これがお役に立てば幸いです。

1
jet

宛先フォルダが存在しないか、書き込み権限がない可能性もあります。

1
ieeehh

Move_uploaded_file()関数の直前に実行する簡単なテスト:

if (!file_exists("upload")) {
  if (mkdir("upload")) {
    echo "Upload directory created!";
  }
  else {
    die( "Invalid upload directory!" );
  }
}
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
0
Stano

今後の参考のために、これはApacheが宛先ディレクトリにアクセスできない場合にも発生する可能性があります(ACLを変更することを忘れないでください!!)。

0
Mark Stahler

同じ問題が発生しました。「tmp_name」は「/ private/var/tmp /」に保存されていると表示されますが、ファイルはそこに存在しません。

Php.iniの「変数の順序」に「E」を追加する必要がありました。 variables_orderデフォルト値: "EGPCS"

お役に立てれば。

0
Prakash Raman

ファイルが実際に/ tmpに作成されていることを100%確信していますか?書き込み権限がない場合(またはスクリプトが実行されるユーザー)、ファイルは/ tmpに書き込まれませんが、アップロードの終了時に実際には存在しませんが、アップロード中に表示されます。

編集:$ _ FILES ['file'] ['error']-値:7;ファイルをディスクに書き込めませんでした。 PHP 5.1.0で導入されました。PHPのバージョンを確認してください。5.1未満の場合は、ディスクへの書き込みが問題になる可能性があります。

0
xintron

$ upload_fileに注意してください。アップロードしたファイルのフォルダパスと名前を連結したときに「/」がない可能性があります。

0
Sensor

私自身もこの問題を抱えています。私の場合、phpは間違ったtmpフォルダーにアップロードしていました。ドメインのtmpフォルダー(pleskの仮想ホスト内)を使用する代わりに、OSの一時フォルダーに直接アップロードしていました。

一時フォルダの設定を確認してください

0
NDM