Как загрузить несколько файлов из формы HTML, используя функцию PHP «SWITCH» с несколькими входными файлами? - PullRequest
0 голосов
/ 19 октября 2018

[ПОСЛЕДНЕЕ РЕДАКТИРОВАНИЕ] После некоторых проблем с последним кодом, вот чистый. Надеюсь, что это может кому-нибудь помочь.

// - HTML -

// - Использованиеname = "image []" во входном файле не работает.// - Лучше, если вы используете name = "image1", name = "image2", name = "image3" и т. Д.

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

                }
            }
        };                  

Теперь я сделаю некоторый процесс безопасности внутри него, и это будет не так уж плохо.

Спасибо за ваше время.

BK201

// - Начало -

Я не понимаю, как загрузить несколько файлов из HTML-формы с помощью PHP.

Iне хочу использовать это: <input type="file" name="" multiple>

Один вход для нескольких файлов - это не то, что я хочу использовать на данный момент.

Итак, начнем:

Я могу загрузить один файл с этим кодом:

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

Но как я могу загрузить несколько файлов?

Я думалМне нужно было:

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

//--something

}

Но ничего ...

Я видел этот ответ от Okonomiyaki3000 здесь (кстати, arigatô, с вашим ответом я видел надежду :)...)

$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,
    );
}

Я понимаю процесс, но он не работает для меня ...

Я пытаюсь все, но я не понимаю, как зацикливать каждый $ _files [POST]

Возможно, я допустил ошибку, которую не вижу, потому что я новичок.

Я также проверяю другие решения и, наконец, прихожу сюда из-за вашей репутации.

Итак, вот полный пример того, что я пробовал перед тем, как спросить.

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

  }


  ?>

[РЕДАКТИРОВАТЬ] Спасибо NiMusco за его помощь.Теперь я лучше понимаю, как посмотреть, что загружено в $ _FILES, но когда я помещаю $ _FILES ['name'] в "$ data" и выводю "$ data", я получаю "Array" ...

Я попробовал что-то простое, возможно, я сделал это неправильно, но для меня это работа, но я не понимаю, чего я ожидаю.

Здесь:

 ?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...."

Я думаю, что «Массив» относится к этому: «[имя] => Массив» print_r ...

Может быть, мне нужно идтивернуться к изучению PHP с самого начала.Я что-то пропустил наверняка.

[EDIT] Я НАШЕЛ РЕШЕНИЕ С ПОМОЩЬЮ NiMusco.

Так вот мой полный код, который работает для меня:

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

                }
            }
        };                  

Спасибо за ваше время.

BK201

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Вы пытались распечатать содержимое $ _FILES?Это прояснит для вас вещи.

Независимо от того, сколько у вас входных файлов или как вы их назвали.Просто итерируйте $ _FILES.

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

    move_uploaded_file($name, $folder . "/" . $name);
  }
}

Добавлен полный пример HTML / PHP по мере необходимости OP.

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

?>

В этом случае $ _FILES дает вам что-то вроде этой структуры:

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
        )

)
0 голосов
/ 19 октября 2018

использование:

<input type="file" name="images[]" multiple>
...