web-dev-qa-db-ja.com

PHP move_uploaded_file()エラー?

次のコードを使用して、ローカルマシンにファイルを正常にアップロードしています。ローカルマシンに「アップロードに成功しました」と表示されています。

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

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

しかし、オンラインサーバーでこのコードを使用した場合、ファイルをアップロードせず、「アップロードされていません」というメッセージが表示されるだけです。

問題が何であるかをどのようにして知ることができ、実際の問題をユーザーに表示するにはどうすればよいですか?

31
Awan

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

40

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

// 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()が役立つ場合があります。

43

これを試して:

$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.';
}

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

34
Martin Bean

何が問題なのかを知るには

簡単です。 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');

他にもいくつかの方法があります。
ただし、実際のエラーメッセージがないと移動できないことを理解する必要があります。暗闇で盲目になるのは難しい

16

move_uploaded_file()は以下を返します。

  1. FALSEファイル名が無効の場合
  2. Apacheプロセスにソースまたは宛先ディレクトリへの読み取り/書き込み権限がない場合、エラーログの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プロセスがファイルを移動しようとしたときに、一時ディレクトリの読み取りまたは宛先ディレクトリへの書き込みができませんでした。

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

  2. 一時ディレクトリで読み取り権限を確認: PHPページでecho sys_get_tmp_dir();を呼び出すことで、一時ディレクトリへのパスを見つけることができます。次に、コマンドラインで_ls -ld /tmp/temporary-dir_を発行して、Apacheユーザーがここを読むためのアクセス権を持っているかどうかを確認します

  3. 宛先ディレクトリの書き込み権限を確認: _ls -ld /var/www/html/destination-directory_を発行して、Apacheユーザーがここに書き込むためのアクセス権を持っているかどうかを確認します

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

  5. Apacheを再起動 _Sudo service httpd restart_を使用

6
Ali Saeed

ファイルが正常にアップロードされていることを確認していますか?たぶん、max_post_sizeまたはmax_upload_filesizeを超えました。 FileZillaを使用してログインするときは、ファイルをコピーします。PHPこのファイルはApache(exaplme www-dataの場合)を実行しているユーザーからのファイルである場合).

2
Piotr Müller

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

1
Jeffery Dilegge

権限「images /」ディレクトリを確認してください

0
Hp Lam

エラー6の非常に不明瞭で迷惑な原因に遭遇しました。NFSでマウントされたボリュームをいじってから、アップロードが失敗し始めました。サービスを再起動することで解決した問題

systemctl restart php-fpm.service
systemctl restart httpd.service
0
glyph

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

enctype="multipart/form-data"

0
dhitro

仮想ホスティングでdisk quota

割り当てを超えた場合、move_uploaded_fileエラーを返します。

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

0
Minherc
$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';
    }
}