PHP move_uploaded_file() エラー?

以下のコードを使用したところ、ローカルマシンにファイルをアップロードすることに成功しました。私のローカルマシンに "Successfully uploaded" と表示されています。

// Upload file
$moved = move_uploaded_file($_FILES["file"]["tmp_name"], "images/" . "myFile.txt" );

if( $moved ) {
  echo "Successfully uploaded";           
} else {
  echo "Not uploaded";
}

しかし、このコードをオンラインサーバで使用すると、ファイルがアップロードされず、"Not uploaded"というメッセージが表示されるだけです。

何が問題なのか、どのようにすれば実際の問題をユーザーに表示させることができるのか、どうすれば知ることができるのでしょうか?

質問へのコメント (9)

コードを次のように編集します。

// Upload file
$moved = move_uploaded_file($_FILES["file"]["tmp_name"], "images/" . "myFile.txt" );

if( $moved ) {
  echo "Successfully uploaded";         
} else {
  echo "Not uploaded because of error #".$_FILES["file"]["error"];
}

次のエラーコード値1〜8のいずれかが表示されます。

UPLOAD_ERR_INI_SIZE =。 値:1;アップロードされたファイルは、php.iniのupload_max_filesizeディレクティブを超えています。

UPLOAD_ERR_FORM_SIZE =。 値:2;アップロードされたファイルは、HTMLフォームで指定されたMAX_FILE_SIZEディレクティブを超えています。

UPLOAD_ERR_PARTIAL =。 値:3;アップロードされたファイルは部分的にしかアップロードされませんでした。

UPLOAD_ERR_NO_FILE =。 値:4;ファイルはアップロードされませんでした。

UPLOAD_ERR_NO_TMP_DIR =。 値:6;一時フォルダがありません。 PHP 5.0.3で導入されました。

UPLOAD_ERR_CANT_WRITE =。 値:7;ファイルをディスクに書き込めませんでした。 PHP 5.1.0で導入されました。

UPLOAD_ERR_EXTENSION =。 値:8; PHP拡張機能により、ファイルのアップロードが停止しました。 PHPは、ファイルのアップロードが停止した原因となった拡張機能を確認する方法を提供していません。 phpinfo()を使用してロードされた拡張機能のリストを調べると役立つ場合があります。

解説 (3)
ソリューション

Webサーバーに"images/"ディレクトリへの書き込み権限があることを確認します。

解説 (2)

これを試して:

$upload_dir = $_SERVER['DOCUMENT_ROOT'] . "/images/";

if (is_dir($upload_dir) && is_writable($upload_dir)) {
    // do upload logic here
} else {
    echo 'Upload directory is not writable, or does not exist.';
}

これにより、ファイル許可エラーが即座にフラグが立てられます。

解説 (4)

どのようにしたら問題があることを知ることができますか?

簡単です。Webサーバーのエラーログを参照してください。

どうすれば、実際の問題をユーザーに表示させることができますか?

**絶対にやってはいけません。
一般的なユーザーはこのエラーについて何も理解できないでしょう。
悪意のあるユーザーは、特に非常に有益なエラーメッセージという形で、何もフィードバックされないはずです。

ただ言い訳のページを表示するだけでいいのです。

もしあなたがサーバーのエラーログにアクセスできないなら、あなたの仕事はより複雑になります。
エラーメッセージに接触する方法はいくつかあります。

エラーメッセージを画面に表示するには、次の行をコードに追加してください。

ini_set('display_errors',1);
error_reporting(E_ALL);

または、カスタムエラーログファイルを作成する

ini_set('log_errors',1);
ini_set('error_log','/absolute/path/tp/log_file');

などの方法があります。
しかし、実際にエラーメッセージが出ないと動けないことを理解する必要があります。暗闇の中で盲目になるのはつらいことです。

解説 (2)

move_uploaded_file()が返されます:

1。 ファイル名が無効な場合は「FALSE」。 2。 apacheプロセスにソースまたは宛先ディレクトリへの読み取り/書き込み権限がない場合、エラーログに「FALSE」および「警告を発行する」。

PHPエラーログ

私のphpエラーログは「/ var / log / httpd / error_log」にあり、これらのエラーがありました:

警告:move_uploaded_file(images / robot.jpg):ストリームの開封に失敗しました:78行目の/var/www/html/mysite/mohealth.phpで許可が拒否されました。

警告:move_uploaded_file():78行目の/var/www/html/mysite/mohealth.phpで '/tmp/phpsKD2Qm'を 'images / robot.jpg'に移動できません。

move_uploaded_file()は、ファイルを一時ディレクトリから宛先ディレクトリに移動しようとします。 apacheプロセスがファイルを移動しようとしたとき、一時的を読んだり、宛先dirに書き込むことができませんでした。

1。 Apache(Webサーバー)を実行しているユーザーを見つけます。 このコマンドで、Apacheサービスを実行しているユーザーを確認します。 ps aux | grep httpd。 最初の列はユーザー名です。

1。 一時Dirで[許可の読み取り]を確認してください。 phpページで echo sys_get_tmp_dir();を呼び出すと、一時dirへのパスを見つけることができます。 次に、コマンドラインで ls -ld / tmp / temporary-dirを発行して、apacheユーザーがここで読むことができるかどうかを確認します。

2。 Destination Dirで書き込み許可を確認してください: ls -ld / var / www / html / destination-directoryを発行して、Apacheユーザーがここに書き込むことができるかどうかを確認します。

3。 chownまたは chgrpを使用して、必要に応じて権限を追加します。

4。 sudo service httpd restartを使用してApache を再起動します。

解説 (2)

ファイルが正常にアップロードされていることを確認していますか?max_post_size、または max_upload_filesize を超えている可能性があります。FileZillaでログインした場合はそのままコピーされますが、PHPでアップロードする場合はapacheを実行しているユーザ(www-dataなど)のファイルなので、画像にchmod 755を付けてみてください。

解説 (0)

またはsuexecを実行し、権限を再度変更する必要はありません。

解説 (0)

エラーの非常にあいまいで迷惑な原因に遭遇しました6。 NFSがマウントされたボリュームをいじくり回した後、アップロードが失敗し始めました。 サービスの再開により問題が解決しました。

systemctl restart php-fpm.service
systemctl restart httpd.service
解説 (0)

formタグにこの属性があることを確認してください。

enctype = "multipart / form-data"

解説 (0)
$uploadfile = $_SERVER['DOCUMENT_ROOT'].'/Thesis/images/';
$profic = uniqid(rand()).$_FILES["pic"]["name"]; 

if(is_uploaded_file($_FILES["pic"]["tmp_name"]))
{
    $moved = move_uploaded_file($_FILES["pic"]["tmp_name"], $uploadfile.$profic);
    if($moved)
    {
        echo "sucess";
    }
    else
    {
        echo 'failed';
    }
}
解説 (0)

仮想ホスティングで「ディスククォータ」を確認します。

クォータを超えると、「move_uploaded_file」の戻りエラー。

PS:私はこれを長い間探していました:)。

解説 (0)

許可「images /」ディレクトリを確認してください。

解説 (0)