2

以下のコードを使用して、許可された拡張子が 5MB 未満のファイルをアップロードしています。しかし、このコードを使用すると、すべての doc や pdf などがアップロードされません! 例: 4.78MB の docx ファイルまたは Windows Phone の 1.64 MB jpg はアップロードされません!

$allowedExts = array("gif", "jpeg", "jpg","png","pdf","doc","docx","txt","rtf","bmp","psd","zip","rar","ppt","pptx");

$extension = end(explode(".", $_FILES["file"]["name"]));

if (in_array($extension, $allowedExts) && $_FILES["file"]["size"]<5242880 && $_FILES["file"]["error"]<=0) {
    $rand = rand(000,999);
    $tempfile = $_FILES["file"]["name"];
    $file = $time . "=" . $rand . "=" . $tempfile;

    if(file_exists("upload/".$file)) {
        header("location:home.php?error=error"); 
    } else {
        move_uploaded_file($_FILES["file"]["tmp_name"],"upload/".$file);
    }
} else {
    header("location:home.php?error=error"); //this gets executed for some doc or pdf files !
}
4

2 に答える 2

3

ここでは、if ステートメントで 3 つの条件を組み合わせています。そのうちの 1 つが失敗すると、elseブロックが実行されます。ただし、どの条件が失敗したかはわかりません。

if ( in_array($extension, $allowedExts) && $_FILES["file"]["size"]<5242880 &&
$_FILES["file"]["error"]<=0) {

ここ:

  • in_array($extension, $allowedExts)— あなたのvar_dump出力から、これは正しいようです。

  • $_FILES["file"]["error"]<=0)— これは問題ありませんが、0未満かどうかを確認する必要はありません。エラーの範囲は 1 から 8 で、0 を下回ることはありませんが、問題は発生しません。

  • $_FILES["file"]["size"]<5242880— これは失敗する可能性があります。php.ini構成を確認し、何が何であるかを調べますupload_max_size。ファイルのファイルサイズよりも小さい場合、条件は失敗し、else ブロックが実行されます。

トラブルシューティングのために、ifステートメントを別々のブロックに分割することをお勧めします。そうすれば、どの部分が実行されているかを理解し、その理由を見つけるのに役立ちます。

例:

$check = True;
if (!condition) {
    $check = False;
}
if (!condition) {
    $check = False;
}
if (!condition) {
    $check = False;
}

if ($check == True) {
    # code...
}

コードのその他のマイナーな改善点を次に示します。

あなたは現在使用しています:

$extension = end(explode(".", $_FILES["file"]["name"]));

画像拡張子を取得します。拡張子の大文字と小文字が異なる場合、これは失敗する可能性があります。

これを次のように変更します。

$extension = strotolower( end(explode(".", $_FILES["file"]["name"])) );

またはさらに良い:

$extension = strtolower( pathinfo($_FILES["file"]["name"], PATHINFO_EXTENSION) );

$time次に、次のステートメントで変数を使用しています。

$file = $time . "=" . $rand . "=" . $tempfile;

その変数はどこにも定義されておらずUndefined variable、スクリプトを実行すると PHP がエラーをスローします。次のように変更します。

$time = time();
$file = $time . "=" . $rand . "=" . $tempfile;

お役に立てれば!

于 2013-08-10T11:41:55.183 に答える
3

そのファイル「Holidays.docx」については、ファイルがupload_max_filesize. $_FILES['file']['error']少なくともそれは var_dumpが1に等しいと言ったことです( UPLOAD_ERR_INI_SIZE

php.ini 設定 upload_max_filesizeを確認する必要post_max_sizeがあります。これは、サーバーにアップロードできるファイルの大きさの実際の制限であるためです。デフォルトupload_max_filesize = 2Mでは、5MB の制限は何の意味もありません。

またini_get('upload_max_filesize');、ランタイム設定を取得するために使用できます。
php.ini 構成ファイルがどこにあるかわからない場合は、 を使用してくださいphpinfo()

また、知っておくべきことは、$_FILES['file']['size']ファイルがファイルサイズの制限を超えた場合、PHP は 0 を返すということです。これはまさに起こったことです。

したがって、IMOはすべて正常に機能しています。アップロードしない他のファイルについては、より多くの var_dump() 情報を投稿する必要があります。

また、大文字と小文字を区別しない方法でファイル拡張子をチェックしないため、 のような拡張子を持つファイルは.DOCXスクリプトで受け入れられないことに注意してください。

于 2013-08-10T11:35:11.463 に答える