以下のコードを使用したところ、ローカルマシンにファイルをアップロードすることに成功しました。私のローカルマシンに "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"というメッセージが表示されるだけです。
何が問題なのか、どのようにすれば実際の問題をユーザーに表示させることができるのか、どうすれば知ることができるのでしょうか?
コードを次のように編集します。
// 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()を使用してロードされた拡張機能のリストを調べると役立つ場合があります。
これを試して:
$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.';
}
これにより、ファイル許可エラーが即座にフラグが立てられます。
どのようにしたら問題があることを知ることができますか?
簡単です。Webサーバーのエラーログを参照してください。
どうすれば、実際の問題をユーザーに表示させることができますか?
**絶対にやってはいけません。
一般的なユーザーはこのエラーについて何も理解できないでしょう。
悪意のあるユーザーは、特に非常に有益なエラーメッセージという形で、何もフィードバックされないはずです。
ただ言い訳のページを表示するだけでいいのです。
もしあなたがサーバーのエラーログにアクセスできないなら、あなたの仕事はより複雑になります。
エラーメッセージに接触する方法はいくつかあります。
エラーメッセージを画面に表示するには、次の行をコードに追加してください。
ini_set('display_errors',1);
error_reporting(E_ALL);
または、カスタムエラーログファイルを作成する
ini_set('log_errors',1);
ini_set('error_log','/absolute/path/tp/log_file');
などの方法があります。
しかし、実際にエラーメッセージが出ないと動けないことを理解する必要があります。暗闇の中で盲目になるのはつらいことです。
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 を再起動します。
$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';
}
}