elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  PHP (Moderador: #!drvy)
| | | |-+  subida de archivos con nombre numerico del array
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: subida de archivos con nombre numerico del array  (Leído 4,402 veces)
gAb1


Desconectado Desconectado

Mensajes: 731


Ver Perfil
subida de archivos con nombre numerico del array
« en: 3 Junio 2016, 16:59 pm »

Estoy teniendo problemas para extender un código existente que guarda imágenes.

Los usuarios pueden subir imagenes y también tienen que poder actualizarlas (eliminar y subir nuevas). Lo primero es lo que tengo terminado, pero lo segundo tengo dudas ya que no quiero guardar las imagenes con su nombre original y en su lugar uso el número del array:

Código
  1. $tmp_name   = $_FILES['file']['tmp_name'];
  2.  
  3. for($i = 0; $i < count($tmp_name); $i++) {
  4.  
  5.    $img_name   = '/' . ($i + 1) . '.jpg';
  6.  
  7. }

Por lo tanto si uso este código la segunda vez que suba imágenes, las que ya existen serán reemplazadas. No me importa si el orden se pierde (pero si es posible prefiero algo limpio):

1.jpg, 2.jpg, 3.jpg ---> 1.jpg, 2.jpg, 3.jpg, 4.jpg, 5.jpg

¿Conoceis alguna manera más limpia de hacer esto? No me importa el nombre que tengan, no es de ningún uso.

Podría usar la hora de subida, algo así, pero me gustaría saber vuestras opiniones y como lo haríais vosotros.

Esta es la función completa, ¿podria mejorarse para que fuera más eficiente?

Código
  1. public function UploadImages($files, $test = '') {
  2.  
  3.    $imagesPath     = '../static.website.com/images/property/' . $this->id;
  4.    $thumbnailsPath = '../static.website.com/images/property/' . $this->id . '/thumbnails';
  5.  
  6.    $log = 'Logging Images Upload:' . "\n\n";
  7.    $upload_err = FALSE;
  8.  
  9.    if ($test == 'new') {
  10.  
  11.        // Will be any problem with $thumbnailsPath?
  12.        if (!mkdir($imagesPath) && !mkdir($thumbnailsPath)) {
  13.  
  14.            return array($upload_err, 'Upload Error: mkdir().');
  15.  
  16.        }
  17.  
  18.    }
  19.  
  20.    $imagesPath     = realpath($imagesPath);
  21.    $thumbnailsPath = realpath($thumbnailsPath);
  22.  
  23.    // Is it ok to only check for the child directory?
  24.    if ( FALSE !== $thumbnailsPath && is_dir($thumbnailsPath) ) {
  25.  
  26.        if (isset($files['file'])) {
  27.  
  28.            $tmp_name   = $files['file']['tmp_name'];
  29.            $img_size   = $files['file']['size'];
  30.  
  31.            // At least 1 image
  32.            if ($test == 'new' && $tmp_name[0] == '') {
  33.  
  34.                $upload_err = TRUE;
  35.                return array($upload_err, '¡La primera imagen es necesaria!');
  36.  
  37.            }
  38.  
  39.            for($i = 0; $i < count($tmp_name); $i++) {
  40.  
  41.                if ($tmp_name[$i] != '') {
  42.  
  43.                    if ($img_size[$i] <= 7340032) {
  44.  
  45.                        $img_name       = '/' . ($i + 1) . '.jpg';
  46.                        $thumbnail_name = '/thumbnail_' . ($i + 1) . '.jpg';
  47.  
  48.                        list($width, $height) = getimagesize($tmp_name[$i]);
  49.  
  50.                        if ($width >= 1100 && $height >= 650) {
  51.  
  52.                            $img    = imagecreatefromjpeg($tmp_name[$i]);
  53.                            $img_p  = imagecreatetruecolor(1100, 650);
  54.                            imagecopyresampled($img_p, $img, 0, 0, 0, 0, 1100, 650, $width, $height);
  55.                            imagedestroy($img);
  56.                            $img_t  = imagecreatetruecolor(180, 180);
  57.                            imagecopyresampled($img_t, $img_p, 0, 0, 0, 0, 180, 180, 1100, 650);
  58.  
  59.                            if (!imagejpeg($img_p, $imagesPath . $img_name, 70) || !imagejpeg($img_t, $thumbnailsPath . $thumbnail_name, 70)) {
  60.  
  61.                                $upload_err = TRUE;
  62.                                return array($upload_err, 'Error al subir la imagen (' . $files['file']['name'][$i] . ')');
  63.  
  64.                            } else $log .= 'IMG: ' . $img_name . ' (original name: ' . $files['file']['name'][$i] . ') uploaded successfully.' . "\n";
  65.  
  66.                            imagedestroy($img_p);
  67.                            imagedestroy($img_t);
  68.  
  69.                        } else {
  70.                            $upload_err = TRUE;
  71.                            return array($upload_err, 'La imagen: ' . $files['file']['name'][$i] . ' debe tener como mínimo 1100px de ancho y 650px de alto.');
  72.                        }
  73.                    } else {
  74.                        $upload_err = TRUE;
  75.                        return array($upload_err, 'La imagen (' . $files['file']['name'][$i] . ') pesa más de 7 MB.');
  76.                    }
  77.                }
  78.            }
  79.        } else return array($upload_err, '$files[\'file\'] is not set:' . "\n" . var_dump($files['file']) . "\n" . 'Property ID: ' . $this->id);
  80.    } else return array($upload_err, '$thumbnailsPath is false and/or not a dir: ' . $thumbnailsPath . '". Property ID: ' . $this->id);
  81.  
  82.    return $log;
  83.  
  84. }

Cualquier surgerencia es bienvenida. Gracias!


En línea

[u]nsigned


Desconectado Desconectado

Mensajes: 2.397

JS/Node developer


Ver Perfil WWW
Re: subida de archivos con nombre numerico del array
« Respuesta #1 en: 3 Junio 2016, 18:09 pm »

Yo te recomendaría que renombres las imagenes usando md5_file(). Entonces la única forma de que se te duplique un nombre es que sea una imagen ya existente. Y creo que tenes un error, porque $_FILES['file']['tmp_name'] devuelve una cadena de texto con la ubicación temporal del archivo, no un array. Deberias iterar sobre $_FILES, que es el array de archivos recibidos por el script.

Tu código recibiría varios archivos a la vez o solo se sube de a uno?


En línea

No hay atajo ante la duda, el misterio se hace aquí...
Se hace carne en cada uno, el misterio es existir!
gAb1


Desconectado Desconectado

Mensajes: 731


Ver Perfil
Re: subida de archivos con nombre numerico del array
« Respuesta #2 en: 3 Junio 2016, 18:38 pm »

Si, ya habia leido en alguna parte lo de usar md5, mientras sea una opción segura. La única pega es que el output es un poco largo para mi gusto, pero bueno supongo que no es relevante (yo y mis manías  :P)

El array $_FILES con más de un archivo tiene la siguiente estructura:

Código
  1. array(1) {
  2.  ["file"]=>
  3.  array(5) {
  4.    ["name"]=>
  5.    array(3) {
  6.      [0]=>
  7.      string(6) "01.jpg"
  8.      [1]=>
  9.      string(6) "01.jpg"
  10.      [2]=>
  11.      string(6) "01.jpg"
  12.    }
  13.    ["type"]=>
  14.    array(3) {
  15.      [0]=>
  16.      string(10) "image/jpeg"
  17.      [1]=>
  18.      string(10) "image/jpeg"
  19.      [2]=>
  20.      string(10) "image/jpeg"
  21.    }
  22.    ["tmp_name"]=>
  23.    array(3) {
  24.      [0]=>
  25.      string(14) "/tmp/phpRBV68j"
  26.      [1]=>
  27.      string(14) "/tmp/phpjuvvG9"
  28.      [2]=>
  29.      string(14) "/tmp/phpJpxmoZ"
  30.    }
  31.    ["error"]=>
  32.    array(3) {
  33.      [0]=>
  34.      int(0)
  35.      [1]=>
  36.      int(0)
  37.      [2]=>
  38.      int(0)
  39.    }
  40.    ["size"]=>
  41.    array(3) {
  42.      [0]=>
  43.      int(74357)
  44.      [1]=>
  45.      int(74357)
  46.      [2]=>
  47.      int(74357)
  48.    }
  49.  }
  50. }

Si, recibe varios a la vez.Estoy usando el plugin dropzone con la opción de multiples archivos.
En línea

[u]nsigned


Desconectado Desconectado

Mensajes: 2.397

JS/Node developer


Ver Perfil WWW
Re: subida de archivos con nombre numerico del array
« Respuesta #3 en: 3 Junio 2016, 20:26 pm »

Para mi es la mejor opción, y no es tan larga, siempre serán 32 caracteres. Lo importantes es usar md5_file y no md5 solo, asi el hash se hace al contenido binario del archivo y no al nombre. Asi, la unica forma de que se te reemplace un archivo es que sea exactamente la misma foto.

Por cuestiones de seguridad siempre debes renombrar los archivos que subes y nunca suar los nombres con los que el usuario te los envia, porque podrias dejar una puerta abierta a vulnerabilidades.

Saludos!
En línea

No hay atajo ante la duda, el misterio se hace aquí...
Se hace carne en cada uno, el misterio es existir!
gAb1


Desconectado Desconectado

Mensajes: 731


Ver Perfil
Re: subida de archivos con nombre numerico del array
« Respuesta #4 en: 4 Junio 2016, 05:29 am »

Vale pero md5_file se lo hago al tmp_name y al nombre? Son dos cosas distintas. No sería md5 a name y md5_file a tmp_name?
En línea

[u]nsigned


Desconectado Desconectado

Mensajes: 2.397

JS/Node developer


Ver Perfil WWW
Re: subida de archivos con nombre numerico del array
« Respuesta #5 en: 4 Junio 2016, 05:43 am »

Solo tenes que usar md5_file con tmp_name, ya que esta función recibe la ruta (path) del archivo y no el nombre. Una vez que ejecutes md5_file sobre tmp_name obtendrás un string de 32 caracteres, este sera el nombre final con el que copiaras la imagen a su destino definitivo. Y no olvides agregarle la extension (.jpg|.png).
En línea

No hay atajo ante la duda, el misterio se hace aquí...
Se hace carne en cada uno, el misterio es existir!
gAb1


Desconectado Desconectado

Mensajes: 731


Ver Perfil
Re: subida de archivos con nombre numerico del array
« Respuesta #6 en: 4 Junio 2016, 06:22 am »

Ah claro ya entiendo, si tiene sentido.

Gracias!
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda en la subida de archivos en php !!! « 1 2 »
PHP
Diabliyo 12 5,868 Último mensaje 29 Abril 2007, 00:01 am
por LuffyFF
Array asociativo y numérico a la vez
PHP
pisagatos 0 2,410 Último mensaje 7 Febrero 2012, 14:23 pm
por pisagatos
como controlar la subida de archivos?
Desarrollo Web
--bl455-- 4 2,154 Último mensaje 26 Julio 2014, 01:05 am
por engel lex
[SOLUCIONADO][PHP] $_FILE[nombre][propiedad] devuelve un array « 1 2 »
Desarrollo Web
LaThortilla (Effort) 13 8,070 Último mensaje 18 Septiembre 2014, 15:56 pm
por LaThortilla (Effort)
Duda con Array c++ 2 Dimensiones y vector de profundiad char nombre[X][Y]
Programación C/C++
jenniferpd 2 2,841 Último mensaje 28 Septiembre 2014, 04:07 am
por rir3760
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines