Водяной знак PHP не сохраняет в папку назначения, но оригинальное изображение делает - PullRequest
0 голосов
/ 25 декабря 2018

Я пытаюсь написать простую галерею php с загрузкой файлов.Я хочу 3 файла для каждой фотографии - оригинал, меньший размер и один с водяным знаком.

Сохранение исходной фотографии работает нормально, но изображение с водяным знаком отсутствует в папке после загрузки.У меня есть разрешение на запись в эту папку, и хотя я пытался использовать chmod, чтобы заставить его, он не работает должным образом.

Мне также нужно сгенерировать изображение в 200x125 пикселей для сервера, но я не смог этого сделать, потому что водяной знак не работает должным образом.

Как мне этого добиться?

<?php
  require '../vendor/autoload.php';

  if (isset($_POST['submit'])){
    $file = $_FILES['file'];
    $fileName = $_FILES['file']['name'];
    $fileTmpName = $_FILES['file']['tmp_name'];
    $fileSize = $_FILES['file']['size'];
    $fileError = $_FILES['file']['error'];
    $fileType = $_FILES['file']['type'];
    $fileExt = explode('.', $fileName);
    $fileActualExt = strtolower(end($fileExt));
    $fileAuthor = $_POST['author'];
    $fileTitle = $_POST['title'];
    $conn = new MongoDB\Client('mongodb://localhost:27017');


    $db = $conn->images;


    $collection = $db->uimages;
    $allowed = array('jpg', 'png', 'jpeg');

    if (in_array($fileActualExt, $allowed)){
        if ($fileError === 0){
            if ($fileSize < 1024000){
                $fileNameID = uniqid('', true).".".$fileActualExt;
                $fileDestFolder = '../images/'.$fileNameID;  
                $image = $_FILES['file'];;


                $fontSize = 4;

                $text = $_POST['watermark'];


                $xPosition = 10;
                $yPosition = 10;

                $newImg = imagecreatefromjpeg($image);

                $fontColor = imagecolorallocate($newImg, 255, 0, 0);

                imagestring($newImg, $fontSize, $xPosition, $yPosition, $text, $fontColor);


                $save = "../images/". "water".$fileNameID .".png";
                chmod($save,0755);
                imagepng($newImg, $save, 0, NULL);
                imagedestroy($newImg);

               // move_uploaded_file($newImg, $fileDestFolder);

                move_uploaded_file($fileTmpName, $fileDestFolder);
                $imageu = [
                    '_id' => $fileNameID,
                    'author' => $_POST['author'],
                    'title' => $_POST['title'],
                  ];
                     $collection->insertOne($imageu);
                header("Location: ../wheels.php?uploadsuccess");


            } else {
                echo "The image size is too big";
            }
        } else {
            echo "There was an error with the image";
        }

    } else {
        echo "You can not use this file extension";
    }


  }

?>

1 Ответ

0 голосов
/ 26 декабря 2018

Ваша строка $image = $_FILES['file'];; (кроме двух точек с запятой - удалите одну из них!) Определяет $image как массив, заданный $_FILES['file'].Вы уже знаете, что это массив, так как вы обращаетесь к его свойствам вверху страницы.

Затем вы передаете этот массив в imagecreatefromjpeg(), который ожидает путь к файлу.Вместо этого вы должны передать $fileTmpName.

Редактировать: Добавлен слегка сжатый, 100% полный проверяемый код (без содержимого MongoDB и перенаправления заголовка) в комплекте с формой, чтобы вы могли проверить:

<?php
if (isset($_POST['submit'])) {
    $file = $_FILES['file'];
    $fileName = $_FILES['file']['name'];
    $fileTmpName = $_FILES['file']['tmp_name'];
    $fileSize = $_FILES['file']['size'];
    $fileError = $_FILES['file']['error'];
    $fileType = $_FILES['file']['type'];
    $fileExt = explode('.', $fileName);
    $fileActualExt = strtolower(end($fileExt));
    $fileAuthor = $_POST['author'];
    $fileTitle = $_POST['title'];

    $allowed = array('jpg', 'png', 'jpeg');

    if (in_array($fileActualExt, $allowed)) {
        if ($fileError === 0) {
            if ($fileSize < 1024000) {
                $fileNameID = uniqid('', true) . "." . $fileActualExt;
                $fileDestination = '../images/' . $fileNameID;

                $fontSize = 4;

                $text = $_POST['watermark'];

                $xPosition = 10;
                $yPosition = 10;

                $newImg = imagecreatefromjpeg($fileTmpName);
                $fontColor2 = imagecolorallocate($newImg, 255, 0, 0);

                imagestring($newImg, $fontSize, $xPosition, $yPosition, $text, $fontColor2);

                $save = "../images/" . "water" . $fileNameID . ".png";

                imagepng($newImg, $save, 0, null);
                imagedestroy($newImg);

                move_uploaded_file($fileTmpName, $fileDestination);
            } else {
                echo "The image size is too big";
            }
        } else {
            echo "There was an error with the image";
        }
    } else {
        echo "You can not use this file extension";
    }

}
?>
<form enctype="multipart/form-data" method="POST">
<label>Watermark</label><input type="text" name="watermark"><br>
<input type="file" name="file">
<input type="submit" name="submit">
</form>

Есть несколько других проблем с кодом (например, вы должны проверять тип файла по типу mime, а не по расширению файла, и загруженный файл JPEG будет заканчиваться именем файла water {uuid} .jpg.png ), но на ваш вопрос должен быть хотя бы ответ.

...