[SOLUCIONADO] Cambiar nombre antes de subir imagen

Iniciado por Rebeca, Marzo 12, 2021, 04:22:24 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Marzo 12, 2021, 04:22:24 PM Ultima modificación: Marzo 16, 2021, 12:25:49 PM por DtxdF
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


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 .!

Marzo 12, 2021, 06:59:04 PM #1 Ultima modificación: Marzo 12, 2021, 07:14:07 PM por DtxdF
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
<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
<?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
php -S 127.0.0.1:8080


E ir al navegador:


Subimos los archivos:


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
ls /tmp/files
# Archivos


Información muy útil:

*.- No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
*.- No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
*.- No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
*.- No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
*.- No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

~ DtxdF
PGP :: <D82F366940155CB043147178C4E075FC4403BDDC>

~ DtxdF

Marzo 12, 2021, 08:22:18 PM #2 Ultima modificación: Marzo 12, 2021, 09:14:00 PM por DtxdF
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
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 !!  :)


Marzo 12, 2021, 09:31:26 PM #3 Ultima modificación: Marzo 13, 2021, 12:21:49 PM por DtxdF
@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
<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
<?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
PGP :: <D82F366940155CB043147178C4E075FC4403BDDC>

~ DtxdF

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
$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
<?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
 $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


Marzo 15, 2021, 01:01:05 PM #5 Ultima modificación: Marzo 15, 2021, 01:04:00 PM por DtxdF
@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: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


El error que describe es, mirando el No tienes permitido ver los links. Registrarse o Entrar a mi cuenta, 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
$filename_parts = explode(".", $_FILES['file_content']['name']);


Y a su vez usar la función end:

Código: php
$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
PGP :: <D82F366940155CB043147178C4E075FC4403BDDC>

~ DtxdF

Marzo 16, 2021, 11:02:40 AM #6 Ultima modificación: Marzo 16, 2021, 11:04:14 AM por Rebeca
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.

@Rebeca


~ DtxdF
PGP :: <D82F366940155CB043147178C4E075FC4403BDDC>

~ DtxdF