es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo guardar una imagen en un directorio con php?

Programador novato aquí. Estoy haciendo un formulario y mi profesor me pidió que suba una imagen desde cualquier ubicación de mi computadora y la guarde en un directorio específico (también de mi computadora). El código que tengo solo funciona si la imagen está en la misma ubicación que mi script. Espero que puedas ayudarme.

Nota: También tengo que guardarlo en la base de datos porque lo voy a usar para hacer un PDF.

HTML:

<html>
<head>
</head>
<form method="post" action="IConductores.php">
<p></p>
    <label>Foto</label>
    <input type="file" id="Foto" name="Foto">
<input type="submit" id="Enviar" name="Enviar">
</form>
</html>

IConductores.php:

<?php
    $Rfc = $_POST['Rfc'];
    $Foto = $_POST['Foto'];

$SQL = "INSERT INTO Conductores VALUES ('$Rfc', '$Foto');";

$destdir = 'ImagenesPerfil/';   // ruta de destino
$img=file_get_contents($Foto);
file_put_contents($destdir.substr($Foto, strrpos($Foto,'/')), $img);
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Hay un par de problemas con el código actual proporcionado. En primer lugar, la variable global $_POST sólo puede recuperar datos que hayan sido enviados a través del método HTTP POST, y no puede manejar archivos. Para manejar archivos, debes usar en su lugar la variable global $_FILES.

    En segundo lugar, la variable $Foto en el script de PHP debe contener la ruta real del archivo subido en el servidor, no sólo su nombre. Para recuperar esto, necesitas usar la variable global $_FILES y acceder a su propiedad tmp_name.

    Por último, para guardar la imagen en la base de datos, necesitas leer realmente el contenido del archivo e insertarlo como un blob binario en la base de datos, en lugar de sólo almacenar el nombre del archivo.

    Con eso en mente, aquí hay un fragmento de código actualizado que debería funcionar:

    HTML:

    <html>
    
    <head>
    </head>
    <form method="post" action="IConductores.php" enctype="multipart/form-data">
    
    <label>Foto</label>
    <input type="file" id="Foto" name="Foto">
    <input type="submit" id="Enviar" name="Enviar">
    </form>
    
    </html>
    

    IConductores.php:

    <?php
        $Rfc = $_POST['Rfc'];
        $Foto = $_FILES['Foto']['tmp_name'];
    
        // Define path destination
        $destdir = 'ImagenesPerfil/';
        // Define destination file name by using the original name of the uploaded file
        $destfile = $destdir . basename($_FILES['Foto']['name']);
        // Move uploaded file to the destination directory
        move_uploaded_file($Foto, $destfile);
    
        // Read the contents of the uploaded file
        $img = file_get_contents($destfile);
    
        // Connect to MySQL database
        $conn = mysqli_connect('localhost', 'username', 'password', 'database_name');
    
        // Prepare SQL statement to insert binary blob data into the database
        $stmt = mysqli_prepare($conn, 'INSERT INTO Conductores (Rfc, Foto) VALUES (?, ?)');
        mysqli_stmt_bind_param($stmt, 'sb', $Rfc, $img);
        mysqli_stmt_execute($stmt);
        mysqli_stmt_close($stmt);
    
        // Close database connection
        mysqli_close($conn);
    ?>
    

    Aquí hay una breve explicación de los cambios:

    • Se añadió el atributo enctype="multipart/form-data" al elemento del formulario, lo que permite subir archivos.
    • Actualizó el script de PHP para usar la variable global $_FILES['Foto'] en lugar de $_POST['Foto'].
    • Se añadió código para mover el archivo subido desde su ubicación temporal al directorio de destino especificado por $destdir.
    • Se actualizó la declaración de SQL para insertar datos de blob binario en la base de datos, y se usó la preparación de declaraciones para evitar ataques de inyección SQL.

Comments are closed.