2012-04-11 7 views
0

私は、いくつかの画像をディレクトリにアップロードするスクリプトを持っています。私は配列の助けを借りてそれを実現します。したがって、私はこのコードを持って:複数のファイルをアップロードして配列を表示

$allowed_extension = array('jpg', 'jpeg', 'png', 'bmp', 'tiff', 'gif'); 
$errors = array(); 
$output = array(); 

if(!empty($_FILES['image']['tmp_name'])){ 

    foreach($_FILES['image']['name'] as $key => $array_value){ 

     if(!in_array(pathinfo($_FILES['image']['name'][$key], PATHINFO_EXTENSION), $allowed_extension)){ 
       die("Die!"); 
     } 
    } 

    foreach($_FILES['image']['name'] as $key => $array_value){ 

     $file_name = $_FILES['image']['name'][$key]; 
     $file_size = $_FILES['image']['size'][$key]; 
     $file_tmp = $_FILES['image']['tmp_name'][$key]; 

     $file_extension = pathinfo($file_name, PATHINFO_EXTENSION); 
     $file_extension = strtolower($file_extension); 

     if (!in_array($file_extension, $allowed_extension)){ 
     $errors[$file_name][] = "format $file_extension in image $file_name is not accepted"; 
     continue; 
     } 

     if ($file_size > 2097152){ 
     $errors[$file_name][] = "maxsize of 2MB on $file_name has reached"; 
        } 

     if (count($errors) == 0){ 

     $dir = "a/b/c"; 

     if (is_dir($dir)){ 
      mkdir("a/b/c/tmp_images", 0755); 
     }else{ 
      mkdir("a/b/c", 0755); 
      mkdir("a/b/c/tmp_images", 0755); 
     } 

     $path = "a/b/c/tmp_images"; 
     $prifix = basename($file_name, "." . $file_extension); 

     //var_dump ($prifix); 

     $uploadfile = $path . "/" . $file_name; 

     $x = 0; 
     while (file_exists($uploadfile)){ 
       $x ++; 
       $uploadfile = "{$path}/{$prifix}-{$x}.{$file_extension}"; 
      } 

      if (move_uploaded_file($file_tmp, $uploadfile)){ 
       $file_name = basename($uploadfile); 
       $output [$file_name] = "OK"; 

      }else{ 

      $output[$file_name] = "Failure while Uploading!"; 
      $errors[$file_name][] = "Failure: Can't move uploaded pictures!"; 
      }//else... 
     }//if(count($errors))... 
    }//foreach($_FILES['image']['name']... 
}//if(!empty($_FILES['image']['tmp_name'])... 

今、私の最初の問題は次のとおりです。私は、ファイルタイプの二つの異なる種類を持っている場合、アップロードは中止され、エラーメッセージが「死にます!」が表示されます。最初のforeach-partがそれを行うコードで見ることができるように。 2番目のforeach-partは私が実際に表示したいものですが、1つの間違ったファイルタイプと1つの正しいファイルタイプの場合に最初のforeach-partを残すと、アップロードが行われます。その問題は、ユーザーがデータを送信した後に変更を加えることができないことです。アップロードを中止する必要があります。

私の2番目の問題は、最初のforeach-partを残すと、間違ったファイルタイプまたはサイズの場合にエラーメッセージを含む配列[0]のテキストを表示するのではなく、単に「配列」と表示されます。出力は "配列"でなければなりません。 "$ file_nameの2MBの最大サイズに達しました"

私はそれを解決する手がかりがありません。何をすべきか教えてくれる人がいれば、本当に感謝しています。どうもありがとう。

+0

なぜあなたは$ _FILESスーパーグローバルの特定のキーをループしていますか? $ _FILES ['image']は画像の1つを参照します。 2つの画像が同じキーを持つことはできません。これは一度だけループします...あなたはHTMLを提供できますか? – trickyzter

+0

Bonny - 1つの提案。配列を扱うときは、print_r関数を使って配列の構造を見ることができます。だから、配列の扱い方がわからないコードの部分がある場合は、print_rを使って、何が起こっているのかを出力してください。ほとんどの場合、これは不当な配列の構造を前提としています。 –

+0

アップロードの成功を確認するために 'if($ _FILES ['image'] ['error'] === UPLOAD_ERR_OK)'を使用してください。ファイルが切り詰められているか破損していても、tmp_nameを取得できます。ユーザー提供のファイル名を信頼しません。 'ren nastyvirus.exe cutekittens.jpg'を実行し、あなたの 'セキュリティ'システムをスリップするのは簡単ではありません。 –

答えて

1

die( "Die!")は使用しないでください。あなたのコードでは、スクリプトの実行を終了します。ルートの原因を見つけるためにHTMLを提供してください。

+0

これは何を意味しますか?>経路の原因を見つけるためにHTMLを提供しますか?ありがとう。 – bonny

+0

複数のファイルに対してファイル選択と参照ボタンを保存したコード... –

関連する問題