Остановить загрузку всех файлов при возникновении ошибки - PHP - PullRequest
0 голосов
/ 05 апреля 2020

Я создал некоторый код, который позволяет пользователю загружать в базу данных MySQL несколько изображений.
Вот две мои проблемы:

  1. Когда происходит ошибка, например, потому что файл не изображение, рассматриваемый файл не загружен, но другие файлы это делают.
    Наоборот, я хочу, чтобы, даже если произошла просто ошибка, файлы не загружались.
    Пример : Если я загружаю 3 файла, и 1 из них не является изображением:
    • Мой вывод, который мне не нужен:
      File 1 uploaded File 2 uploaded Just JPG and PNG images are allowed // file 3 not uploaded
    • Что я ожидаю получить:
      No files uploaded // Even if a single file is not good, nobody gets uploaded
  2. Если я загружу n файлов, будут напечатаны n сообщений. Например, если я загружу 3 файла, это будет вывод:
    File 1.png upload correctly File 2.png upload correctly File 3.png upload correctly
    Но я надеюсь получить только одно предложение, например 3 files uploaded.

Вот мой код:

$timestamp = time();
$total = count($_FILES[ 'upload' ][ 'name' ]);
                if ($total==0) {
                    echo "Please upload at least one file";
                    $uploadOk = 0;
                } else {
                    $tmpFilePath = $_FILES['upload']['tmp_name'][$i];
                    for($i = 0; $i < $total; $i++) {
                        if ($tmpFilePath != '') {
                            $newFilePath = "./uploadFiles/" . $_FILES['upload']['name'][$i];
                            $completeFileName = basename($_FILES["upload"]["name"][$i]);
                            $target_file = "uploads/$completeFileName"; $uploadOk = 1;
                            $estensione = strtolower(pathinfo($target_file, PATHINFO_EXTENSION));
                            $Name = basename($_FILES["upload"]["name"][$i]);
                            if($extension != 'jpg' && $extension != 'png') {
                                echo "Only JPG and PNG files are allowed";
                                $uploadOk = 0;
                            } else {
                                $fileName = str_replace(".$extension", '', $completeFileName);
                                $string = substr(md5(mt_rand()), 0, 15);
                                $id = rand(1, 100000);
                                $finalFileName = 'uploads/'.$string.$id.'.'.$estensione;
                                if (move_uploaded_file($_FILES["upload"]["tmp_name"][$i], $finalFileName)) {
                                    $mysqli = new mysqli('localhost', 'example', '', 'my_example');
                                    $mysqli->query("INSERT INTO uploads (timestamp, file) VALUES ('$timestamp', '$finalFileName')");
                                      echo "<h2>The file <i>$fileName</i> has been uploaded.</h2>";
                                } else echo "Error";
                            }
                        }
                    }
                }
            }

Я надеюсь, что мое объяснение понятно. Спасибо!

1 Ответ

0 голосов
/ 05 апреля 2020
<?php
/*
 * CREATE TABLE `uploads` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `timestamp` int(11) DEFAULT NULL,
  `file` varchar(400) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 */

$mysqli = new mysqli('localhost', 'devel', 'devel', 'upload_db');

$timestamp = time();
$success_images = [];
$total = count($_FILES[ 'upload' ][ 'name' ]);
if ($total == 0) {
    echo "Please upload at least one file";
    $uploadOk = 0;
} else {

    $uploadOk = 1;

    for ($i = 0; $i < $total; $i++) {
        $tmpFilePath = $_FILES[ "upload" ][ "tmp_name" ][ $i ];
        if ($tmpFilePath != '') {
            $newFilePath = "./uploadFiles/" . $_FILES[ 'upload' ][ 'name' ][ $i ];
            $Name = basename($_FILES[ "upload" ][ "name" ][ $i ]);
            $parts = pathinfo($Name);
            $extension = strtolower($parts[ 'extension' ]);
            if ($extension == 'jpg' || $extension == 'png') {

                // there may be $newFilePath I think
                if (move_uploaded_file($_FILES[ "upload" ][ "tmp_name" ][ $i ], $newFilePath)) {

                    $mysqli->query("INSERT INTO uploads (timestamp, file) VALUES ('$timestamp', '$Name')");
                    $id = $mysqli->insert_id;
                    $success_images[ $id ] = $newFilePath;
                    $uploadOk = 1;

                } else {

                    echo "Error";
                    $uploadOk = 0;

                    break; // break loop !!!
                }
            } else {

                echo "Just JPG and PNG files are allowed";
                $uploadOk = 0;
                break;
            }
        }
    }

    if ($uploadOk === 0) {

        foreach ($success_images as $id => $filename) {
            // `id` - primary key of table uploads?
            $mysqli->query(sprintf('DELETE FROM uploads WHERE `id`=%d', $id));
            if (file_exists($filename)) {
                unlink($filename);
            }
        }
    } else {

        foreach ($success_images as $id => $filename) {

            echo "<h2>The file <i>$filename</i> has been uploaded.</h2>";

        }

    }
}

?>
<form method="POST" enctype="multipart/form-data">
    <input type="file" multiple name="upload[]"/>
    <input type="submit" value="do_upload"/>
</form>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...