次のコードを使用して、ローカルマシンにファイルを正常にアップロードしています。ローカルマシンに「アップロードに成功しました」と表示されています。
// Upload file
$moved = move_uploaded_file($_FILES["file"]["tmp_name"], "images/" . "myFile.txt" );
if( $moved ) {
echo "Successfully uploaded";
} else {
echo "Not uploaded";
}
しかし、オンラインサーバーでこのコードを使用した場合、ファイルをアップロードせず、「アップロードされていません」というメッセージが表示されるだけです。
問題が何であるかをどのようにして知ることができ、実際の問題をユーザーに表示するにはどうすればよいですか?
Webサーバーに「images /」ディレクトリへの書き込み権限があることを確認します
コードを次のように編集します。
// 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; A 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サーバーのエラーログを参照してください。
実際の問題をユーザーに表示するにはどうすればよいですか?
[〜#〜] never [〜#〜]やる。
平均的なユーザーは、このエラーについて何も理解しません。
悪意のあるユーザーは、特に非常に有益なエラーメッセージの形式で、フィードバックを受け取るべきではありません。
言い訳のあるページを表示するだけです。
サーバーのエラーログにアクセスできない場合、タスクはより複雑になります。
エラーメッセージに連絡する方法はいくつかあります。
画面にエラーメッセージを表示するには、これらの行をコードに追加します。
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()
は以下を返します。
FALSE
ファイル名が無効の場合FALSE
および_issue a warning
_PHPエラーログ
私のPHPエラーログは_/var/log/httpd/error_log
_にあり、これらのエラーがありました:
警告:move_uploaded_file(images/robot.jpg):ストリームを開けませんでした:/var/www/html/mysite/mohealth.phpの78行目で許可が拒否されました
警告:move_uploaded_file(): '/ tmp/phpsKD2Qm'を78行目の/var/www/html/mysite/mohealth.phpの 'images/robot.jpg'に移動できません
move_uploaded_file()
は、一時ディレクトリから宛先ディレクトリにファイルを移動しようとします。 Apacheプロセスがファイルを移動しようとしたときに、一時ディレクトリの読み取りまたは宛先ディレクトリへの書き込みができませんでした。
Apache(Webサーバー)を実行しているユーザーを見つける次のコマンドで、Apacheサービスを実行しているユーザーを確認します:_ps aux | grep httpd
_。最初の列はユーザー名です。
一時ディレクトリで読み取り権限を確認: PHPページでecho sys_get_tmp_dir();
を呼び出すことで、一時ディレクトリへのパスを見つけることができます。次に、コマンドラインで_ls -ld /tmp/temporary-dir
_を発行して、Apacheユーザーがここを読むためのアクセス権を持っているかどうかを確認します
宛先ディレクトリの書き込み権限を確認: _ls -ld /var/www/html/destination-directory
_を発行して、Apacheユーザーがここに書き込むためのアクセス権を持っているかどうかを確認します
必要に応じて、chown
またはchgrp
を使用して権限を追加します
Apacheを再起動 _Sudo service httpd restart
_を使用
ファイルが正常にアップロードされていることを確認していますか?たぶん、max_post_sizeまたはmax_upload_filesizeを超えました。 FileZillaを使用してログインするときは、ファイルをコピーします。PHPこのファイルはApache(exaplme www-dataの場合)を実行しているユーザーからのファイルである場合).
または、suexecを実行して、許可を再度変更する必要はありません。
権限「images /」ディレクトリを確認してください
エラー6の非常に不明瞭で迷惑な原因に遭遇しました。NFSでマウントされたボリュームをいじってから、アップロードが失敗し始めました。サービスを再起動することで解決した問題
systemctl restart php-fpm.service
systemctl restart httpd.service
form
タグに次の属性があることを確認してください。
enctype="multipart/form-data"
仮想ホスティングでdisk quota
。
割り当てを超えた場合、move_uploaded_file
エラーを返します。
PS:私はこれを長い間探していました:)
$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';
}
}