1

いくつかの画像をディレクトリにアップロードするのが好きなアップロードスクリプトがあります。

私はこのコードを使用します:

$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'])... 

問題はその部分です:

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!");
            }
        }

2種類のファイルタイプをアップロードする場合、アップロードはキャンセルされます。これが私の最初の問題です。このような場合、フォームを投稿した後に作成したいファイルのために、アップロードをキャンセルする必要があります。そのため、ユーザーはフォームを投稿した後に変更を加えることはできません。2番目の部分を見てみましょう:

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";
                        ...}

ここでは、エラーメッセージが表示されているはずであることが実際にアプローチされるべきであることがわかります。最初のforeach-partを残すと、2つの異なるファイルタイプの場合、1つのファイルがアップロードされ、もう1つのファイルではエラーメッセージが表示されるという問題が発生しました。

したがって、最初のforeachと2番目のforeachを組み合わせる方法があるはずです。正しい方法を教えてくれる人がいたら、本当にありがたいです。どうもありがとう。

アップデート

さて、遅れてすみません。ここに私のフィードバックがあります:このコードは、2つの異なるファイルタイプの場合にいくつかの問題があるようです。のようです

if (count($errors)>0){
   die ("...")
} 

実際には数えません。その場合、エラーメッセージが表示されます。

Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to access a/b/c/tmp_images/abc.xls

ただし、拡張子が許可されている画像のアップロードも行いますが、他のファイルタイプが間違っているため、これは成功しません。問題は、これにより、ここに配置される挿入クエリが発生することです。

if (move_uploaded_file($fileTmp, $fileDst)) {
            $output[$fileBase] = "OK";

            **$insert = $db->query("INSERT INTO table ( a, b, c) VALUES('".$a."','".$b."','".$c."')");{

            mkdir("a/b/c/d/e", 0755);
            rename("a/b/c/tmp_images", "a/b/c/d/e/tmp_images");

            $msg ="text abc.";                          

            $to = "xxx@xxx.xx";
            $subject = "xxx ";
            $message = "text";

            $headers  = "From: xxx<xxx@xxx.xx>\r\n";
            $headers .= "Content-type: text/plain; charset=UTF-8\r\n";
            $mailheader .= "Return-Path: failuremail@" .$_SERVER['SERVER_NAME']. "\r\n";
            $mailheader .= "MIME-Version: 1.0\r\n";
            $mailheader .= "Content-Transfer-Encoding: 7bit\r\n";
            $mailheader .= "Message-ID: <" .time(). " noreply@" .$_SERVER['SERVER_NAME']. ">\r\n";
            $mailheader .= "X-Mailer: PHP v" .phpversion(). "\r\n\r\n";

            mail($to, $subject, $message, $headers);

            }//**

            }else{

                $output[$fileBase] = "Fehler beim Upload des Bildmaterials!";
                $errors2[$fileBase][] = "Fehler: Die hochgeladenen Dateien können nicht verschoben werden!";
            }//             
        }//

        if (count($errors) > 0) {
            die("Failurecode: ");
            echo "$errors";
    }...

そして、フォーミュラと同じページにある1次元配列からのエラーメッセージを取得するのと同じ方法で、2次元配列からエラーメッセージを取得するようにアプローチしたいと思います。「die」の場合、エラーを表示するために新しい空のページが開きます。どうもありがとう。

4

3 に答える 3

1

これを試して、

$filename = $_FILES["quoteexcel"]["name"]; 
//here $filename is an array of file names to be uploaded
$tmpvalues = $_FILES["quoteexcel"]["tmp_name"]; 
//here $tmpvalues is an array of temporary file names

$j=0;
foreach($filename as $key => $value)
{
 $ext = pathinfo($value, PATHINFO_EXTENSION);       
 if($ext=='jpg' || $ext=='jpeg' || $ext=='png' || $ext=='tiff' || $ext=='gif')
 $j = $j;
 else     $j++;                                         
}

if($j==0)
{
 foreach($filename as $key => $value)
  {
     //do the upload process here;
  }
}
else
{
   echo "file format not supported";
}
于 2012-04-12T10:03:53.870 に答える
1

これには 2 つのループが必要ですが、このアプローチには少し欠陥があります。すべてのファイルのすべての検証を実行する検証ループが必要です。次に、ファイルを永続的なストレージに移動するだけの 2 番目のループが必要です。

このようなもの ( FIXED ):

<?php

  // Settings
  $allowedExtensions = array('jpg', 'jpeg', 'png', 'bmp', 'tiff', 'gif');
  $maxSize = 2097152;
  $storageDir = 'a/b/c/tmp_images';

  // Result arrays
  $errors = $output = array();

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

    // Validation loop (I prefer for loops for this specific task)
    for ($i = 0; isset($_FILES['image']['name'][$i]); $i++) {

      $fileName = $_FILES['image']['name'][$i];
      $fileSize = $_FILES['image']['size'][$i];
      $fileErr = $_FILES['image']['error'][$i];
      $fileExt = strtolower(pathinfo($fileName, PATHINFO_EXTENSION));

      // Validate extension
      if (!in_array($fileExt, $allowedExtensions)) {
        $errors[$fileName][] = "Format $fileExt in image $fileName is not accepted";
      }

      // Validate size
      if ($fileSize > $maxSize) {
        $errors[$fileName][] = "$fileName excedes the maximum file size of $maxSize bytes";
      }

      // Check errors
      if ($fileErr) {
        $errors[$fileName][] = "$fileName uploaded with error code $fileErr";
      }

    }

    // Handle validation errors here
    if (count($errors) > 0) {
      die("Errors validating uploads: ".print_r($errors, TRUE));
    }

    // Create the storage directory if it doesn't exist
    if (!is_dir($storageDir)) {
      if (!mkdir($storageDir, 0755, TRUE)) { // Passing TRUE as the third argument creates recursively
        die("Unable to create storage directory $storageDir");
      }
    }

    // File move loop
    for ($i = 0; isset($_FILES['image']['name'][$i]); $i++) {

      // Get base info
      $fileBase = basename($_FILES['image']['name'][$i]);
      $fileName = pathinfo($fileBase, PATHINFO_FILENAME);
      $fileExt = pathinfo($fileBase, PATHINFO_EXTENSION);
      $fileTmp = $_FILES['image']['tmp_name'][$i];

      // Construct destination path
      $fileDst = $storageDir.'/'.basename($_FILES['image']['name'][$i]);
      for ($j = 0; file_exists($fileDst); $j++) {
        $fileDst = "$storageDir/$fileName-$j.$fileExt";
      }

      // Move the file    
      if (move_uploaded_file($fileTmp, $fileDst)) {
        $output[$fileBase] = "Stored $fileBase OK";
      } else {
        $output[$fileBase] = "Failure while uploading $fileBase!";
        $errors[$fileBase][] = "Failure: Can't move uploaded file $fileBase!";
      }

    }

    // Handle file move errors here
    if (count($errors) > 0) {
      die("Errors moving uploaded files: ".print_r($errors, TRUE));
    }

  }
于 2012-04-12T09:05:29.300 に答える
0
if(!empty($_FILES['image']['tmp_name']))
{  
    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($file_size > 2097152)
        {
            $errors[$file_name][] = "maxsize of 2MB on $file_name has reached";
        }           
        if(!in_array($file_extension, $allowed_extension)
        {
            $errors[$file_name][] = "format $file_extension in image $file_name is not accepted";
        }
    }
}
于 2012-04-12T08:50:11.317 に答える