0

[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

Community
  • 1
  • 1

2 Answers2

0

use:

<input type="file" name="images[]" multiple>
  • Hello Waseel, thank you for answering me. It's just because of that?? I thought "multiple" was for upload multiple files in one input type=file... Ok I try and come back here. – BK201 Freelance Oct 19 '18 at 14:07
  • yeah, most probably. if you want to upload multiple images, you have to use multiple attribute with input, it will send an array of images. you can see the from following link: [you can see this question answer](https://stackoverflow.com/questions/24895170/multiple-image-upload-php-form-with-one-input) I hope it will help you. – Waseel Ahmad Mufti Oct 19 '18 at 14:11
  • Ok. I understand what you mean but I don't want to solve the problem by using one input type="file" multiple. Maybe later I will use this and thank you for that. But for the moment, this problem is inside my mind so I want to understand how that works and after that I will see which one suit my project. I want to learn and find solutions. I don't want to find a solution that just came up. I want to look inside, try, etc.. Sorry that was not a "bad mood answer", it's just a clarification of what I expect. Thank you Waseel! – BK201 Freelance Oct 19 '18 at 14:18
0

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
        )

)
SomeRSGuy
  • 590
  • 7
  • 19
  • Thank you NiMusco, I did not use this method. I never used it so it's time. Than you! – BK201 Freelance Oct 19 '18 at 15:00
  • You are welcome. Do print_r($_FILES) and you'll see. I think you can go from there. – SomeRSGuy Oct 19 '18 at 15:09
  • Ok. I did it and I saw all my files inside arrays. So now I have to loop inside these arrays by their name like this: " foreach ($_FILES['image']['name'] as ??) { my code; }" ? – BK201 Freelance Oct 19 '18 at 15:20
  • Ok. Thank you for your answer. I try something and I come back. I feel the exit of this issue. – BK201 Freelance Oct 19 '18 at 15:35
  • 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; } } ?>" – BK201 Freelance Oct 19 '18 at 15:43
  • I get "array" but I want the name of the file. I go deep into PHP and I come back here with more in my brain. – BK201 Freelance Oct 19 '18 at 16:00
  • You said you don't want to use "images[]". I'll add HTML aswell. Test it in a different file so you can understand. – SomeRSGuy Oct 19 '18 at 16:05
  • Oh no sorry! Of course, I use "image[]". I don't want to use "one input" with "multiple". I will try your example and I will come back. Thank you for your help! Like I expected! – BK201 Freelance Oct 20 '18 at 00:50
  • I'm back after "Une nuit blanche" of brainstorming for that code. Nothing. Now I try to use my code for one upload and make it works for each one by one. In this case, I will see what I can simplify and I will understand better. Your code doesn't move the files unfortunately but I saw the structure of $_FILES so I can work with that. I will edit my post if I found something. Thank you ! – BK201 Freelance Oct 20 '18 at 10:48
  • EUREKA!!!!!!!!!! Thank you NiMusco !!!! Merci NiMusco !!!!. From your code and some research on the Internet, I made something who works! Edited my answer. Thank you and good trip ! – BK201 Freelance Oct 21 '18 at 00:27
  • You're welcome. If it's resolved you should mark my answer as correct. Have a nice day. – SomeRSGuy Oct 22 '18 at 16:44