普通网友 2018-10-19 14:02
浏览 61
已采纳

如何使用带有多个输入文件的PHP“SWITCH”函数从HTML表单上传多个文件?

[LAST EDIT] After some troubles with the last code, here a clean one.Hope that can help somebody.

// -- HTML --

//-- Using name="image[]" in the input file doesn't work. //-- Better if you use name="image1", name="image2", name="image3", etc..

<div class="container">

  <label for="title">Title:</label>
  <input type="hidden" name="MAX_FILE_SIZE" value="500000" />
  <input type="file" class="form-control" name="image1" id="upload_file_pc" required><br /><br />

  <label for="title">title:</label>
  <input type="hidden" name="MAX_FILE_SIZE" value="500000" />
  <input type="file" class="form-control" name="image2" id="upload_file_pc" required><br /><br />

  <label for="title">title:</label>
  <input type="hidden" name="MAX_FILE_SIZE" value="500000" />
  <input type="file" class="form-control" name="image3" id="upload_file_pc" required><br /><br />

  <label for="title">title:</label>
  <input type="hidden" name="MAX_FILE_SIZE" value="500000" />
  <input type="file" class="form-control" name="image4" id="upload_file_pc" required><br /><br />

</div>

  <button type="submit" name="form_upload_file" class="btn btn-primary">Envoyer</button>

// -- PHP --

foreach($_FILES as $file){

            $filesname = ($file["name"]); //-- Client file name

            $target_dir = "upload/"; //-- Here you can add after the " /" something for recognize the file up.

            $target_file = $target_dir . basename($filesname);

            $filestmp = ($file["tmp_name"]);

            $filessize = ($file["size"]);

            $uploadOk = 1;

            $imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));

        // Check if the image file is an actual image or fake image

            if(isset($_POST["submit"])){

                $check = getimagesize($filessize);

                if($check !== false) {

                    $messagemerci = "File is an image - " . $check["mime"] . ".";

                    $uploadOk = 1;

                } 

                else {

                    $messagemerci = "File is not an image.";

                    $uploadOk = 0;

                }
            }

        // Check if the file already exists

            if (file_exists($target_file)) {

                $messagemerci = "Sorry, file already exists.";

                $uploadOk = 0;
            }

        // Check file size

            if ($filessize > 500000) {

                $messagemerci = "Sorry, your file is too large.";

                $uploadOk = 0;

            }

        // Allow certain file formats

            if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType !="jpeg" && $imageFileType != "gif" && $imageFileType != "pdf" ) {

                $messagemerci = "Sorry, only JPG, JPEG, PNG, GIF & PDF files are allowed.";

                $uploadOk = 0;
            }

        // Check if $uploadOk is set to 0 by an error

            if ($uploadOk == 0) {

                $messagemerci = "Sorry, your file was not uploaded.";

        // if everything is ok, try to upload the file

            } 

            else {

                if (move_uploaded_file($filestmp, $target_file)) {

                    $messagemerci = "The file ". basename( $filesname). " has been uploaded.";

                } 

                else {

                    $messagemerci = "Sorry, there was an error uploading your file.";

                }
            }
        };                  

Now I will make some security process inside it and it will be not so bad.

Thank for your time.

BK201

// -- Beginning --

I don't understand how to download multiple files from an HTML form using PHP.

I don't want to use this: <input type="file" name="" multiple>

One input to allow multiple files it's not something I want to use for the moment.

So let's start:

I can upload one file with this code:

    <?php
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
// Check if image file is a actual image or fake image
if(isset($_POST["submit"])) {
    $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
    if($check !== false) {
        echo "File is an image - " . $check["mime"] . ".";
        $uploadOk = 1;
    } else {
        echo "File is not an image.";
        $uploadOk = 0;
    }
}
// Check if file already exists
if (file_exists($target_file)) {
    echo "Sorry, file already exists.";
    $uploadOk = 0;
}
// Check file size
if ($_FILES["fileToUpload"]["size"] > 500000) {
    echo "Sorry, your file is too large.";
    $uploadOk = 0;
}
// Allow certain file formats
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {
    echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
    $uploadOk = 0;
}
// Check if $uploadOk is set to 0 by an error
if ($uploadOk == 0) {
    echo "Sorry, your file was not uploaded.";
// if everything is ok, try to upload the file
} else {
    if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
        echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.";
    } else {
        echo "Sorry, there was an error uploading your file.";
    }
}
?>

But how can I upload multiple files?

I thought I needed:

foreach ($_FILES["image”]["tmp_name"] as $index){

//--something

}

But nothing...

I saw this answer from Okonomiyaki3000 here(arigatô by the way, with your answer I saw hope :)... )

$files = array_map('RemapFilesArray'
    (array) $_FILES['attachments']['name'],
    (array) $_FILES['attachments']['type'],
    (array) $_FILES['attachments']['tmp_name'],
    (array) $_FILES['attachments']['error'],
    (array) $_FILES['attachments']['size']
);

function RemapFilesArray($name, $type, $tmp_name, $error, $size)
{
    return array(
        'name' => $name,
        'type' => $type,
        'tmp_name' => $tmp_name,
        'error' => $error,
        'size' => $size,
    );
}

I understand the process but doesn't work for me...

I try everything but I don't understand how to loop every $_files[POST]

Maybe I made a mistake that I cannot see because I'm a newbie.

I also check other solutions and finally, I come here because of your reputation.

So here a complete example of what I tried before asking.

//-- In this case, I want to upload multiple files with an HTML form and a PHP action.
//-- I don't understand how to loop with each file in $_Files.
//-- I made 3 examples, working for 1 file upload but not for 4 files.
//-- Anyone can explain to me how it works. NOT JUST WRITING THE RIGHT WAY PLEASE.



<html>
<body>

<h4>Documents justificatifs:</h4>

  <form action="upload_file_pc.php" name="upload_file_pc" method="post" enctype="multipart/form-data">

    <div class="container">

      <label for="title">Title:</label>
      <input type="hidden" name="MAX_FILE_SIZE" value="500000" />
      <input type="file" class="form-control" name="image[]" id="upload_file_pc" required><br /><br />

      <label for="title">title:</label>
      <input type="hidden" name="MAX_FILE_SIZE" value="500000" />
      <input type="file" class="form-control" name="image[]" id="upload_file_pc" required><br /><br />

      <label for="title">title:</label>
      <input type="hidden" name="MAX_FILE_SIZE" value="500000" />
      <input type="file" class="form-control" name="image[]" id="upload_file_pc" required><br /><br />

      <label for="title">title:</label>
      <input type="hidden" name="MAX_FILE_SIZE" value="500000" />
      <input type="file" class="form-control" name="image[]" id="upload_file_pc" required><br /><br />

    </div>

      <button type="submit" name="form_upload_file" class="btn btn-primary">Envoyer</button>

   </form>

 </body>
 </html>

 //-- Exemple 1:

 <?php

 function reArrayFiles(&$file_post) {

    $file_ary = array();
    $file_count = count($file_post['name']);
    $file_keys = array_keys($file_post);

    for ($i=0; $i<$file_count; $i++) {
        foreach ($file_keys as $key) {
            $file_ary[$i][$key] = $file_post[$key][$i];
        }
    }

    return $file_ary;
}



if ($_FILES['upload']) {
    $file_ary = reArrayFiles($_FILES['image']);

    foreach ($file_ary as $file) {
        print 'File Name: ' . $file['name'];
        print 'File Type: ' . $file['type'];
        print 'File Size: ' . $file['size'];
    }
}


 ?>

 //-- Exemple 2:

 <?php
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["image"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
// Check if image file is a actual image or fake image
if(isset($_POST["submit"])) {
    $check = getimagesize($_FILES["image"]["tmp_name"]);
    if($check !== false) {
        echo "File is an image - " . $check["mime"] . ".";
        $uploadOk = 1;
    } else {
        echo "File is not an image.";
        $uploadOk = 0;
    }
}
// Check if file already exists
if (file_exists($target_file)) {
    echo "Sorry, file already exists.";
    $uploadOk = 0;
}
// Check file size
if ($_FILES["image"]["size"] > 500000) {
    echo "Sorry, your file is too large.";
    $uploadOk = 0;
}
// Allow certain file formats
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {
    echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
    $uploadOk = 0;
}
// Check if $uploadOk is set to 0 by an error
if ($uploadOk == 0) {
    echo "Sorry, your file was not uploaded.";
// if everything is ok, try to upload the file
} else {
    if (move_uploaded_file($_FILES["image"]["tmp_name"], $target_file)) {
        echo "The file ". basename( $_FILES["image"]["name"]). " has been uploaded.";
    } else {
        echo "Sorry, there was an error uploading your file.";
    }
}
?>

//-- Exemple 3:

<?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));
    }

  }


  ?>

[EDIT] Thank you to NiMusco for his help. Now I understand better how to see what is uploaded in $_FILES but when I put $_FILES['name'] in "$data" and echo "$data" I get "Array"...

So I tried something simple, maybe I did it wrong but for me it's work but I don't get what I expect.

Here :

 ?php
    if(!empty($_FILES))
    {
      foreach($_FILES as $file)
      {
        $namefile = $file['name'];
        echo $namefile;
      }
    }
    ?>". 


But what I get is " Array ".... not the file name. here what I get when I do:

print_r($_FILES) :" Array
    (
        [image] => Array
            (
                [name] => Array
                    (
                        [0] => img_1.jpg
                        [1] => img_2.jpg
                        [2] => img_3.jpg
                        [3] => img_4.jpg
                    )

                [type] => Array
                    (
                        [0] => image/jpeg
                        [1] => image/jpeg
                        [2] => image/jpeg
                        [3] => image/jpeg
                    )" etc...."

I think "Array" refer at this : "[name] => Array" of print_r ...

Maybe I need to go back to learn PHP from the beginning. I missed something for sure.

[EDIT] I FOUND THE SOLUTION WITH THE HELP OF NiMusco.

So here my full code who works for me:

// -- HTML --

<div class="container">

  <label for="title">Title:</label>
  <input type="hidden" name="MAX_FILE_SIZE" value="500000" />
  <input type="file" class="form-control" name="image[]" id="upload_file_pc" required><br /><br />

  <label for="title">title:</label>
  <input type="hidden" name="MAX_FILE_SIZE" value="500000" />
  <input type="file" class="form-control" name="image[]" id="upload_file_pc" required><br /><br />

  <label for="title">title:</label>
  <input type="hidden" name="MAX_FILE_SIZE" value="500000" />
  <input type="file" class="form-control" name="image[]" id="upload_file_pc" required><br /><br />

  <label for="title">title:</label>
  <input type="hidden" name="MAX_FILE_SIZE" value="500000" />
  <input type="file" class="form-control" name="image[]" id="upload_file_pc" required><br /><br />

</div>

  <button type="submit" name="form_upload_file" class="btn btn-primary">Envoyer</button>

// -- PHP --

foreach($_FILES as $file){

            $filesname = ($file["name"]);

            $target_dir = "upload/";

            $target_file = $target_dir . basename($filesname);

            $filestmp = ($file["tmp_name"]);

            $filessize = ($file["size"]);

            $uploadOk = 1;

            $imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));

        // Check if the image file is an actual image or fake image

            if(isset($_POST["submit"])){

                $check = getimagesize($filessize);

                if($check !== false) {

                    $messagemerci = "File is an image - " . $check["mime"] . ".";

                    $uploadOk = 1;

                } 

                else {

                    $messagemerci = "File is not an image.";

                    $uploadOk = 0;

                }
            }

        // Check if the file already exists

            if (file_exists($target_file)) {

                $messagemerci = "Sorry, file already exists.";

                $uploadOk = 0;
            }

        // Check file size

            if ($filessize > 500000) {

                $messagemerci = "Sorry, your file is too large.";

                $uploadOk = 0;

            }

        // Allow certain file formats

            if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType !="jpeg" && $imageFileType != "gif" && $imageFileType != "pdf" ) {

                $messagemerci = "Sorry, only JPG, JPEG, PNG, GIF & PDF files are allowed.";

                $uploadOk = 0;
            }

        // Check if $uploadOk is set to 0 by an error

            if ($uploadOk == 0) {

                $messagemerci = "Sorry, your file was not uploaded.";

        // if everything is ok, try to upload the file

            } 

            else {

                if (move_uploaded_file($filestmp, $target_file)) {

                    $messagemerci = "The file ". basename( $filesname). " has been uploaded.";

                } 

                else {

                    $messagemerci = "Sorry, there was an error uploading your file.";

                }
            }
        };                  

Thank for your time.

BK201

  • 写回答

2条回答 默认 最新

  • dpr77335 2018-10-19 14:51
    关注

    Did you try printing the content of $_FILES? It would clarify things for you.

    No matter how many input files do you have, or how you named it. Just iterate $_FILES.

    if(!empty($_FILES))
    {
      foreach($_FILES as $file)
      {
        $name = $file['name'];
        $folder = "/uploads";
    
        move_uploaded_file($name, $folder . "/" . $name);
      }
    }
    

    Added a full HTML/PHP example as OP needed.

    <form method="post" enctype="multipart/form-data">
      <input type="file" name="file1">
      <input type="file" name="file2">
      <input type="file" name="file3">
      <input type="submit">
    </form>
    
    <?php
    
      if(!empty($_FILES))
      {
        foreach($_FILES as $file)
        {
          $name = basename($file['name']);
          $folder = "/uploads";
    
          move_uploaded_file($name, $folder . "/" . $name);
        }
      }
    
    ?>
    

    In this case, $_FILES gives you something like this structure:

    Array
    (
        [file1] => Array
            (
                [name] => IMG_20180918_094315304.jpg
                [type] => image/jpeg
                [tmp_name] => /tmp/phpYDmeY7
                [error] => 0
                [size] => 5342893
            )
    
        [file2] => Array
            (
                [name] => IMG_20180918_094323718.jpg
                [type] => image/jpeg
                [tmp_name] => /tmp/php9cXCkE
                [error] => 0
                [size] => 5783548
            )
    
        [file3] => Array
            (
                [name] => IMG_20180918_094336974.jpg
                [type] => image/jpeg
                [tmp_name] => /tmp/phphljHJa
                [error] => 0
                [size] => 4819618
            )
    
    )
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
  • ¥15 ubuntu系统下挂载磁盘上执行./提示权限不够
  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 关于#r语言#的问题:差异分析前数据准备,报错Error in data[, sampleName1] : subscript out of bounds请问怎么解决呀以下是全部代码:
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型