PHP - ¿Cómo guardar imagen en el servidor usando GD y después descargarla automáticamente o manual?

 
Vista:
Imágen de perfil de Albert Caifan
Val: 15
Ha aumentado su posición en 13 puestos en PHP (en relación al último mes)
Gráfica de PHP

¿Cómo guardar imagen en el servidor usando GD y después descargarla automáticamente o manual?

Publicado por Albert Caifan (9 intervenciones) el 22/12/2021 17:43:35

Hola amigos, planteo lo siguiente:



Estoy haciendo un pequeño sistema para crear cupones de descuento usando la librería GD de PHP.
Consiste en usar una imagen base para los cupones (blanco.jpg). El cupón se llena con la información que se recupera de la BD.

Lo que he logrado hasta ahora es:
- guardar la información del cliente en la DB.
- recuperar e insertar texto en la imagen (con la librería GD) desde la DB.
- descargar automáticamente el cupón después de enviar la petición (aun no sé resetear el formulario solo con PHP).

Quiero optimizar mi código

pero aun no encuentro la manera de hacerlo porque tengo la duda de saber cual será la mejor opción:
1) llenar formulario->descargar cupón automáticamente->resetear formulario.
descargar automáticamente el cupón desde la misma página después de haber llenado el formulario (necesito resetear el formulario para evitar el duplicado de inserción de los mismos datos, no sé cómo hacerlo solo con PHP). Hasta ahora es así como funciona mi programa, pero aun tengo el problema del reseteo del formulario.
2) llenar formulario->descargar cupón desde otra página.
guardar el cupón en el servidor y después redirigir a otra página donde se continúe con la descarga desde el servidor, ya sea con una página de agradecimiento o que se muestre solo un link de descarga.


Mi problema principal es:
- no sé resetear un formulario (sólo sé hacerlo con "header (location: url)" pero me genera problemas con la descarga automática ya que los encabezados de redireccionamiento deben estar en el principio de código).
- no tengo idea de cómo guardar la imagen en el servidor usando la librería GD de PHP y después descargarla mediante un link.
- no estoy seguro de que el método que quiero usar sea el correcto o el óptimo (guardar en servidor y después descargar).

EXTRA: Quiero resetear el formulario, ya sea por redireccionamiento o con alguna función de PHP (creo que no existe). Solo encontré el método de JS + AJAX pero las cosas se complicarían un poco mas.

Dejo al alcance el código de los 2 archivos que estoy usando.

index.php:
1
2
3
4
5
6
7
8
<form action="crear_cupon.php" class="formulario" method="POST">
   <img src="img/logo.png" alt="VL-Receptivo">
   <input type="text" placeholder="Nombre(s)" name="nombre">
   <input type="text" placeholder="Apellido(s)" name="apellido">
   <input type="email" placeholder="email" name="correo">
   <input type="tel" placeholder="Teléfono" name="telefono">
   <input class="button" type="submit" value="Crear cupón" name="crear">
</form>

crear_cupon.php:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<?php
include_once 'bdconect.php';
 
if (isset ($_POST['crear'])) {
    !isset ($_POST['nombre']) ?: $nombre = $_POST['nombre'];
    !isset ($_POST['apellido']) ?: $apellido = $_POST['apellido'];
    !isset ($_POST['correo']) ?: $correo = $_POST['correo'];
    !isset ($_POST['telefono']) ?: $telefono = $_POST['telefono'];
 
 
    if ($conn->connect_errno) {
        echo "Falló la conexión a MySQL: (" . $conn->connect_errno . ") " . $conn->connect_error;
    }
 
    $sql = "START TRANSACTION;";
    $sql .= "INSERT INTO pasajeros (nombre, apellido, email, telefono) VALUES ('$nombre', '$apellido', '$correo', '$telefono');";
    $sql .= "INSERT INTO cupones (id_pasajero) VALUES (LAST_INSERT_ID());";
    $sql .= "SELECT id_cupon FROM cupones WHERE id_cupon = LAST_INSERT_ID();";
    $sql .= "COMMIT;";
 
    if (!$conn->multi_query($sql)) {
        echo "Falló la multiconsulta: (" . $conn->errno . ") " . $conn->error;
    }
 
    do {
        if ($resultado = $conn->store_result()) {
            $row = ($resultado->fetch_all(MYSQLI_ASSOC));
            foreach($row as $cupon):
 
                //Aquí COMIENZA el bloque donde uso la librería GD
                header('Content-type: image/jpeg');
 
                $salida = "cupon"."$cupon[id_cupon]".".jpg";
 
                // Crear la imagen usando la imagen base
                $image = imagecreatefromjpeg('img/blanco.jpg');
 
                // Asignar el color para el texto
                $color = imagecolorallocate($image, 255, 19, 155);
 
                // Asignar la ruta de la fuente
                $font_path = __DIR__.'\Roboto-Bold.ttf';
 
                $text = "VL-"."$cupon[id_cupon]"; // Texto 1
 
                /// imagettftext ( resource $image , float $size , float $angle , int $x , int $y , int $color , string $fontfile , string $text )
                imagettftext($image, 40, 0, 270, 420, $color, $font_path, $text);
 
                header('Content-Disposition: attachment; filename="' . $salida . '"');
 
                imagepng($image); // Enviar el contenido al navegador
 
                imagedestroy($image); // Limpiar la memoria
 
            endforeach;
            $resultado->free();
 
        }
    } while ($conn->more_results() && $conn->next_result());
 
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder