Underc0de

Foros Generales => Dudas y pedidos generales => Mensaje iniciado por: Rebeca en Marzo 12, 2021, 04:22:24 PM

Título: [SOLUCIONADO] Cambiar nombre antes de subir imagen
Publicado por: Rebeca en Marzo 12, 2021, 04:22:24 PM
Hola a todos, estoy aprendiendo , alomejor para ustedes es facil, .. mi logica esta media loca...

quiero cambiar el nombre de la foto que sube un cliente con el nombre del cliente .. pero no me sale.. sale la foto con el nombre cambiado sin la extensión

dejo mi código de PHP
Código (php) [Seleccionar]


include_once "../config.inc.php";
$con=conectar();
// Recibo los datos de la imagen
$imagen=$_FILES['imagen']['name'];
$tipo=$_FILES['imagen']['type'];
$tamano = $_FILES['imagen']['size'];


//Si existe imagen y tiene un tamaño correcto

if (($imagen == !NULL) && ($_FILES['imagen']['size']= 200000)){
   //indicamos los formatos que permitimos subir a nuestro servidor
   if (($_FILES["imagen"]["type"] == "image/gif")
   || ($_FILES["imagen"]["type"] == "image/jpeg")
   || ($_FILES["imagen"]["type"] == "image/jpg")
   || ($_FILES["imagen"]["type"] == "image/png")){
    $nombre_img = $_POST['cl_comercio'];

// Ruta donde se guardarán las imágenes que subamos
   
         $directorio ="files/";

            move_uploaded_file($_FILES['imagen']['tmp_name'],$directorio.$nombre_img);
            $nombre_imgn = mysqli_escape_string($con, $nombre_img);
            $query = "INSERT INTO alumnos1 (nombre_img,tipo) values ('".$nombre_img."','".$tipo."');
            ";
        $res = mysqli_query($con, $query);
   
}else{

    echo "no es correcto";

}
}


Muchas gracias por su tiempo
saludos .!
Título: Re: Cambiar nombre antes de subir imagen
Publicado por: DtxdF en Marzo 12, 2021, 06:59:04 PM
Hola @Rebeca

Supongo que el campo nombrado cl_comercio en el formulario HTML (si se usa HTML, claro está) es donde se introduce el nombre del archivo, pero no es necesario, ya que el mismo arreglo $_FILES te permite obtenerlo, dependiendo de la petición.

Para brindar un ejemplo con lo que basarse, he aquí dos códigos: un archivo HTML, y otro PHP.

index.html:
Código (html5) [Seleccionar]
<html lang="es">
<head>
<title>Test</title>
<meta charset="UTF-8">
</head>
<body>
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="files[]" multiple="multiple">
<input type="submit">
</form>
</body>

</html>


upload.php:
Código (php) [Seleccionar]
<?php

/* El directorio donde se guardarán los archivos. */
$upload_dir "/tmp/files";
/* El nombre del campo en el formulario. */
$field_name "files";
/* Se cuentan los archivos. */
$total count($_FILES[$field_name]["name"]);

for (
$i 0$i $total$i++) {
/* Obtenemos el nombre temporal, que es donde reside el archivo. */
$tmpFilename $_FILES[$field_name]["tmp_name"][$i];
/* 
* Evitamos un posible error obteniendo el nombre, en caso de que un usuario
* malintencionado coloque como nombre de archivo /etc/passwd, por ejemplo,
* se transformaría a passwd.
*/
$realName basename($_FILES[$field_name]["name"][$i]);

/* Ahora, lo movemos :-p */
if (move_uploaded_file($tmpFilename"$upload_dir/$realName")) {
/* Hacer algo :D */

} else {
/* Demonios, un error :/ */

}

}

?>


Como ve, es permitido subir una cantidad de archivos variables, aunque dependerá de max_file_uploads en /etc/php/php.ini (la ruta es relativa al SO, en mi caso, Arch Linux), y el tamaño máximo de un archivo, se lo puede dejar a upload_max_filesize en el susodicho archivo de configuración.

Ahora, para probar, podríamos iniciar el servidor de PHP para desarrollo:

Código (bash) [Seleccionar]
php -S 127.0.0.1:8080

E ir al navegador:

(https://imgur.com/95Bsv0v.png)

Subimos los archivos:

(https://imgur.com/tRiFMdt.png)

Los enviamos, pero vemos que la pantalla está en blanco, así que nos vamos a nuestra terminal, y listamos los archivos en el directorio donde están guardados los archivos:

Código (bash) [Seleccionar]
ls /tmp/files
# Archivos


Información muy útil:

*.- https://www.php.net/manual/es/function.move-uploaded-file.php
*.- https://www.php.net/manual/es/features.file-upload.errors.php
*.- https://www.php.net/manual/es/features.file-upload.multiple.php
*.- https://www.php.net/manual/es/control-structures.foreach.php
*.- https://www.php.net/manual/es/function.is-null.php

~ DtxdF
Título: Re: Cambiar nombre antes de subir imagen
Publicado por: Rebeca en Marzo 12, 2021, 08:22:18 PM
Hola, Gracias por responder, me sale un error que creo que es el nombre del directorio,, yo uso xampp en windows.

este es el error.

Código (text) [Seleccionar]
Warning: move_uploaded_file(/tmp/files/rebeca.jpg): failed to open stream: No such file or directory in C:\xampp\htdocs\SUBO_UNDER\guardo.php on line 21

Warning: move_uploaded_file(): Unable to move 'C:\xampp\tmp\phpE2B.tmp' to '/tmp/files/rebeca.jpg' in C:\xampp\htdocs\SUBO_UNDER\guardo.php on line 21

Warning: move_uploaded_file(/tmp/files/rebeca1.jpg): failed to open stream: No such file or directory in C:\xampp\htdocs\SUBO_UNDER\guardo.php on line 21

Warning: move_uploaded_file(): Unable to move 'C:\xampp\tmp\phpE3B.tmp' to '/tmp/files/rebeca1.jpg' in C:\xampp\htdocs\SUBO_UNDER\guardo.php on line 21

Warning: move_uploaded_file(/tmp/files/Sin título.png): failed to open stream: No such file or directory in C:\xampp\htdocs\SUBO_UNDER\guardo.php on line 21

Warning: move_uploaded_file(): Unable to move 'C:\xampp\tmp\phpE3C.tmp' to '/tmp/files/Sin título.png' in C:\xampp\htdocs\SUBO_UNDER\guardo.php on line 21


Muchas gracias.
y disculpa la pregunta, entiendo eso de mandar muchos archivos a la vez, ( lo entiendo porque me lo pasaste),
el tema es que un chico sube una imagen y le quiere poner el nombre que quiera. la pregunta es , se puede?...
ya que en el formulario tengo un campo que es cl_cliente que seria el nombre del archivo...
pero si no se puede hacer, es imposible después buscar el archivo y vincularlo con el chico...

Muchísimas gracias por compartir tu código y tu tiempo !!  :)

Título: Re: Cambiar nombre antes de subir imagen
Publicado por: DtxdF en Marzo 12, 2021, 09:31:26 PM
@Rebeca

Los errores se deben a que estás en Windows, o sea, no es culpa del sistema operativo, es que se debe escribir una ruta que el sistema pueda entender.

Podría crear una carpeta a donde desee, y cambiar el valor de la variable $upload_dir de upload.php, a la ruta de la nueva carpeta.

Citarel tema es que un chico sube una imagen y le quiere poner el nombre que quiera. la pregunta es , se puede?

Sí, y para demostrarlo, vamos a usar los mismos archivos que compartí en mi anterior comentario.


Teniendo:

index.html
Código (html) [Seleccionar]
<html lang="es">
<head>
<title>Test</title>
<meta charset="UTF-8">
</head>
<body>
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="text" name="filename" placeholder="Nombre del archivo...">
<input type="file" name="file_content">
<input type="submit">
</form>
</body>

</html>


upload.php
Código (php) [Seleccionar]
<?php

/* El directorio donde se guardarán los archivos. */
$upload_dir "/tmp/files";
/* El nombre del campo en el formulario. */
$field_name "filename";

$filename basename($_POST[$field_name]);
$tmp_name $_FILES["file_content"]["tmp_name"];

if (
move_uploaded_file($tmp_name"$upload_dir/$filename")) {
/* Hacer algo :D */

} else {
/* Oh, oh... */

}

?>


El usuario sería libre entonces de elegir el nombre que le plazca, ya que el campo filename lo permite.

~ DtxdF
Título: Re: Cambiar nombre antes de subir imagen
Publicado por: Rebeca en Marzo 15, 2021, 11:53:53 AM
Hola.!!! :)
Gracias por tu repuesta,  le comento que ha pasado, al subir la imagen, y le pongo de nombre "Rebe", lo guarda sin extensión.  buscando por todos lasdos encontre esta funcion

Código (php) [Seleccionar]
$extension = ".".end(explode(".", $_FILES['file_content']['name']));

Entonces ahora si me sube la imagen con el nombre que yo quiera y la estación..

Espectacular su código.

pero como siempre me pasa hay un error  :-[ :-[

el error es este y dejo código :

Notice: Only variables should be passed by reference in C:\xampp\htdocs\SUBO_UNDER\guardo.php on line 4

Código (php) [Seleccionar]
<?php

/* El directorio donde se guardarán los archivos. */
$extension ".".end(explode("."$_FILES['file_content']['name']));
$upload_dir "files";
/* El nombre del campo en el formulario. */
$field_name "filename";

$filename basename($_POST[$field_name]);
$tmp_name $_FILES["file_content"]["tmp_name"];

if (
move_uploaded_file($tmp_name"$upload_dir/$filename.$extension")) {
 
/* Hacer algo :D */

} else {
 
/* Oh, oh... */

}

?>





Linea 4 es esta.
Código (php) [Seleccionar]
$extension = ".".end(explode(".", $_FILES['file_content']['name']));

No se done como solucionarlo, porque no puedo dejar al usuario que el mismo le ponga la extensión
Muchas Gracias por su tiempo..!!!
Saludos _ Rebeca

Título: Re: Cambiar nombre antes de subir imagen
Publicado por: DtxdF en Marzo 15, 2021, 01:01:05 PM
@Rebeca

Hay diferentes tipos de errores con los que se puede encontrar, pero debe fijarse por su gravedad, no obstante no quiere decir que deban pasar desapercibidos porque podrían provocar otras fatalidades e incongruencias en futuras ejecuciones de su proyecto. He aquí un útil artículo que le explica los errores y su gravedad: https://cybmeta.com/tipos-de-errores-en-php


El error que describe es, mirando el prototipo de la función end (https://www.php.net/manual/es/function.end.php), verá que nos dice que es necesario pasar el arreglo por referencia, por lo que es mejor primero y antes, crear una variable:

Código (php) [Seleccionar]
$filename_parts = explode(".", $_FILES['file_content']['name']);

Y a su vez usar la función end:

Código (php) [Seleccionar]
$extension = ".".end($filename_parts);

Esto funcionaría tal cual como lo haría el código que me pasó, no obstante, el error de baja gravedad sería descartado.

Citarporque no puedo dejar al usuario que el mismo le ponga la extensión

Aquí recibo una duda automáticamente al concluir esa parte de su mensaje, porque si desea que el usuario, de forma arbitraria, manipule la extensión, no debería usar $_FILES['file_content']['name'], pero sí la variable $filename, ya que esa es la que el usuario manipula y no el navegador.


Nota: Le recomiendo crear una forma de verificar que el archivo subido tiene extensión, antes de empezar a analizarlo.

~ DtxdF
Título: Re: Cambiar nombre antes de subir imagen
Publicado por: Rebeca en Marzo 16, 2021, 11:02:40 AM
Hola.!!! si se que me falta mucho por aprender, y lo estoy haciendo, es mas fuerte mi ansiedad que otra cosa..
el código y la solución que me paso, anduvo dé 10.! se agradece su tiempo y en leer mis códigos.
Muchísimas gracias, ahora empiezo a validar lo que es tamaño y todo eso.

Se agradece un Montón :D :D.

Saludos cordiales
Rebeca.
Título: Re: [SOLUCIONADO] Cambiar nombre antes de subir imagen
Publicado por: DtxdF en Marzo 16, 2021, 12:26:56 PM
@Rebeca

(https://media.tenor.com/images/a8e6e7cd2b162480957bc6667764a38b/tenor.gif)

~ DtxdF