0

私のPHPスクリプトで非常に奇妙な問題が発生しています。

いくつかのファイルをアップロードし、PHP でそれらすべてを 1 つのフォルダーに入れます。ランダムなファイルが送信され、ランダムなファイルが送信されないという問題があります。それでデバッグしたところ、$_FILES[] 配列から非常に奇妙な結果が得られました。

3つのファイルで試しました。

$_FILES["addFile"]["name"]3 つのファイルの名前を保持します。

PHP がファイルをコピーするために使用する 3 つの一時的な名前を保持することを期待$_FILES["addFile"]["tmp_name"]しますが、そうではありません。保持する名前は 1 つだけです。他の 2 つは空の文字列で、アップロード中にエラーが発生します (これは表示されません)。

これは非常に奇妙です。私は複数の状況を試しましたが、それは起こり続けています。これは、私の設定またはおそらく私のコードの何かに違いありません。

これが私のコードです:

$i = 0;
  if (!empty($_FILES['addFile'])) {
    foreach($_FILES['addFile'] as $addFile) {
      $fileToCopy = $_FILES["addFile"]["tmp_name"][$i];
      $fileName   = $_FILES["addFile"]["name"][$i];
      $i++;
      if(!empty($fileToCopy)){
       $copyTo = $baseDir."/".$fileName;
       @copy($fileToCopy, $copyTo) or die("cannot copy ".$fileToCopy." to ".$copyTo);
      }
     }
          exit(0);
   }

tmp_name が空であるため、if-value は false になり、die() 関数をスキップします。

誰がこれを引き起こしているのか知っていますか?

詳細情報: Windows XP を使用しており、WAMP サーバーを実行しています。以前にこの問題が発生したことはなく、アップロードしようとしたすべてのマップにアクセスできます。Windows のセキュリティ設定が問題になることはないと思います。

4

3 に答える 3

3

申し訳ありませんが、3 つのファイルすべてを同じ変数名でアップロードしようとしているように思えます。これは正しいですか?しかし、それらは互いに上書きするため、これは機能しません。次のようなものを使用する方がクリーンな方法だと思います

    $i = 0;
    foreach($_FILES['addFile'.$i] as $addFile) {
     if(!empty($addFiles) {
        move_uploaded_file($addFile['temp_name'], 'YOUR DIRECTORY');
     }
      $i++;
   }
于 2008-12-11T11:50:28.817 に答える
1

関連性がありますが、おそらく役に立たないでしょう: しかし、move_uploaded_file は、アップロードされたファイルをコピーするよりも (わずかに) 優れた方法です。

大きなファイルはありますか?PHPには、ファイルサイズとアップロードにかかる時間に制限があります...

そこに書かれていることを書き留めようとするよりも、ここにあなたを送ったほうがよいでしょう:

http://uk3.php.net/manual/en/features.file-upload.common-pitfalls.php

于 2008-12-11T11:28:44.180 に答える
1

ループ ロジックが正しくありません。ファイル入力名に対して foreach ループを直接使用しています。これには、関心のないいくつかのプロパティ (「タイプ」、「サイズ」など) が格納されます。

最初のファイルからファイル数を取得し、それをループの長さとして使用する必要があります。

if (!empty($_FILES['addFile']) && is_array($_FILES['addFile']['name'])) {
    $length = count($_FILES['addFile']['name']);
    for($i = 0; $i < $length; $i++) {
        $result = move_uploaded_file($_FILES['addFile']['tmp_name'][$i],$baseDir."/" . $_FILES['addFile']['name'][$i]);
         if($result === false) {
            echo 'File upload failed. The following error has occurred: ' . $_FILES['addFile']['error'][$i];
         }
     }
}

それでも問題が解決しない場合は、エラー コードを確認してください。デバッグに必要なすべての情報が含まれているはずです。

于 2008-12-11T11:34:54.980 に答える