PHP - Multiple File Upload

 
Vista:

Multiple File Upload

Publicado por Ricardo (12 intervenciones) el 21/02/2019 13:42:50
Hola amigos, una consulta que me esta volviendo loco:
Necesito poder subir varios archivos de fotos a mi web e inmediatamente renombrarlos según una codificación especial que tengo. Puedo subirlos sin problema pero al renombrarlos solo lo hace con el primero! No entiendo que esta mal, a continuación el código:

1
2
3
4
5
6
7
8
9
$p = 120000; //variable que recibo por $_REQUEST
for ($i=0; $i<$countfiles; $i++){
	$filename = $_FILES['file-es']['name'][$i];
	$filename2 = $p.'_'.$i.'.jpg';
	// Upload file
	move_uploaded_file($_FILES['file-es']['tmp_name'][$i],'fotos_tmp/'.$filename);
        // los ....... se refieren a todo el path en mi servidor
        rename("....../fotos_tmp/$filename","/........./fotos_tmp/$filename2");
}

Si no uso la linea "rename" todos los archivos suben perfecto a la carpeta temporal, si uso la linea "rename" solo un archivo queda en la carpeta temporal, el primero, ya que queda renombrado como "120000_0.jpg"
Es como si la linea "rename" no estuviera en el bucle for, pero no es asi!
Les agradezco cualquier ayuda que pudieran darme!
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
Imágen de perfil de Kathyu
Val: 1.802
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Multiple File Upload

Publicado por Kathyu (905 intervenciones) el 21/02/2019 15:40:42
Creo que la forma en la que lo esta haciendo es la incorrecta, yo hago eso pero dentro del foreach tengo esto (solo para renombrar)

1
2
3
$extension = explode(".",$_FILES["documento"]["name"][$i]);
$nameDocumento = $_FILES["documento"]["name"][$i];
$nameEncrypt = sha1(uniqid($nameDocumento)).".".$extension[1];

$nameDocumento recibe el nombre real del archivo
$nameEncrypt cambia ese nombre por un id único y lo encripta a un hash sha1 que es el que guardo en la DB y con el que renombro el archivo por temas de seguridad
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Multiple File Upload

Publicado por Ricardo (12 intervenciones) el 21/02/2019 21:15:44
Gracias Kathyu por tu respuesta,
En realidad no necesito encriptar ni guardar el nombre del archivo en ninguna base de datos. Solo necesito "renombrar" el archivo una vez subido al disco del servidor. A eso apunta mi código, pero falla como lo explico mas arriba, sin saber porque.
Saludos,
Ricardo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kathyu
Val: 1.802
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Multiple File Upload

Publicado por Kathyu (905 intervenciones) el 21/02/2019 22:58:58
Como se ve que no entendió nada de lo que le explique

Igual haga como quiera, solo un consejo, el hecho que yo puse código para encriptar y "mencioné" guardar en DB's no significa que usted va a copiar y pegar mi código y mágicamente va a resolver sus problemas.

Le coloque código para que lo adapte a su problema, es seguro que yo si podría resolver su gran problema pero no espere que lo haga por usted.

Salu2
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Multiple File Upload

Publicado por Ricardo (12 intervenciones) el 22/02/2019 02:09:34
No, no entendí su respuesta y perdón si eso la ofendió, no fue para nada mi intención.
Tampoco pretendo que nadie haga el trabajo por mi, solo busco una explicación que me ayude a resolver el problema.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kathyu
Val: 1.802
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Multiple File Upload

Publicado por Kathyu (905 intervenciones) el 22/02/2019 17:59:14
Pero es claro, yo renombro mis archivos, de su nombre original a el nombre encriptado que yo quiero, olvide lo de encriptar, simplemente su linea de rename es la que a mi ver genera el problema.

1
2
$extension = explode(".",$_FILES["documento"]["name"][$i]);
$nameEncrypt = $p."_".$i.".".$extension[1];

Ve difícil adaptar algo como eso ??
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Multiple File Upload

Publicado por Ricardo (12 intervenciones) el 22/02/2019 19:07:56
Nuevamente, muchas gracias por molestarse en responderme.
Esta solución tampoco funciona, la variable $i permanece con valor cero (0) en todo el bucle for, generando un solo archivo de salida: 120000_0.jpg
No entiendo porque $i no toma los valores de 0 a "cantidad de fotos subidas" previsto dentro del bucle, no tiene sentido!
ya sea directamente con move_uploaded_file o con rename, siempre que $i forme parte del nombre del file destino, el resultado es un solo archivo en el servidor: 120000_0.jpg ya que $i no se mueve de cero.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kathyu
Val: 1.802
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Multiple File Upload

Publicado por Kathyu (905 intervenciones) el 22/02/2019 21:01:29
Quizás sea el for.

Mi for
1
for($i=0;$i<count($_FILES["documento"]["name"]);$i++)


No ha intentado borrar todo y buscar otro ejemplo y modificarlo? tal vez algo se ha pasado sin querer
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Multiple File Upload

Publicado por Ricardo (12 intervenciones) el 22/02/2019 22:38:29
Su for es igual al mio, ya que yo antes del for tengo:

$countfiles = count($_FILES['file-es']['name']);

El for no es el problema porque si yo quito $i del nombre del file destino, todas las fotos suben sin problema al servidor. O sea, el bucle se ejecuta siempre. Pero cuando $i es parte del nombre del file destino, solo uno archivo queda en el servidor

No encuentro ejemplos donde los archivos en el server queden identificados con un "número de orden", o con un nombre generado a partir de una variable "no aleatoria" dentro del bucle.

Adaptando su primer sugerencia de la siguiente forma:

1
2
3
4
5
6
7
$p = 120000;
$countfiles = count($_FILES['file-es']['name']);
for($i=0;$i<$countfiles;$i++){
    $extension = explode(".",$_FILES["file-es"]["name"][$i]);
    $nameEncrypt = $p."_".sha1(uniqid($nameDocumento)).".".$extension[1];
    move_uploaded_file($_FILES['file-es']['tmp_name'][$i],'fotos_tmp/'.$nameEncrypt);
}

Y subiendo 4 fotos al servidor, el resultado es el siguiente:
120000_c5fecf4d90a452f59d47f61b1274a22c91531548.jpg
120000_9c1ee31004dd94b4f37b6defc80788ad8639d53c.jpg
120000_538ead6d11173f817242e4bf3376fed982767c84.jpg
120000_37faad9b78f450f0b5a1e616c3ea052297e55f12.jpg

O sea, las 4 fotos suben correctamente, solo que ahora debo reemplazar todo lo que hay después de guión bajo (_) con un número de orden. Quizás deba aplicar otras instrucciones de manejo de archivos y olvidarme de resolverlo en un solo paso.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kathyu
Val: 1.802
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Multiple File Upload

Publicado por Kathyu (905 intervenciones) el 22/02/2019 23:18:41
Si para el lunes no lo ha resuelto meteré manos acá en mi ambiente de pruebas.

Favor respalde su código y déjelo por ahí y lo veré el lunes, ya que en fin de semana no toco PC's
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Multiple File Upload

Publicado por Ricardo (12 intervenciones) el 23/02/2019 00:28:45
Muchas gracias por su preocupación.

Algo mas que puedo determinar:
Si hago participar a $countfiles como parte del nombre del file destino (solo para conocer su valor), siempre tiene valor uno (1) !

1
2
3
4
5
6
7
$p = 120000;
$countfiles = count($_FILES['file-es']['name']);
for($i=0;$i<$countfiles;$i++){
  $extension = explode(".",$_FILES["file-es"]["name"][$i]);
  $nameEncrypt = $p."_".$countfiles."_".sha1(uniqid($nameDocumento)).".".$extension[1];
  move_uploaded_file($_FILES['file-es']['tmp_name'][$i],'fotos_tmp/'.$nameEncrypt);
}

El resultado, no importa la cantidad de archivos que suba, es similar a mi post anterior pero con un 1 al centro en el nombre de files, lo cual quiere decir que $countfiles = 1

120000_1_c5fecf4d90a452f59d47f61b1274a22c91531548.jpg
120000_1_9c1ee31004dd94b4f37b6defc80788ad8639d53c.jpg
120000_1_538ead6d11173f817242e4bf3376fed982767c84.jpg

Entonces, ¿Cómo se ejecuta el bucle for correctamente si la cantidad de veces que debe hacerlo es siempre 1 ? Esto es un quebradero de cabeza.
Por ahora termino también, pero seguramente mañana seguiré investigando. Muchas gracias por tu ayuda y que tengas un excelente fin de semana!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve
Val: 3.943
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Multiple File Upload

Publicado por xve (6935 intervenciones) el 22/02/2019 07:50:10
Hola Ricardo, yo creo que haces un paso mas de la cuenta en tu código...

La verdad, no se ver porque solo te renombra el primer archivo y el resto no... pero yo lo que haria sera eliminar el rename, y hacerlo todo en el move_uploaded_file()... algo así:

1
move_uploaded_file($_FILES['file-es']['tmp_name'][$i],'fotos_tmp/'.$filename2);

Puedes probar si te funciona?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Multiple File Upload

Publicado por Ricardo (12 intervenciones) el 22/02/2019 13:10:39
Gracias xve!

Sucede lo mismo, solo el primer archivo queda en el servidor, esto es lo que veo: 120000_0.jpg
Es como que $i no funciona o es ignorado en el bucle, y no comprendo porque.

Yo necesito que las fotos suban y queden renombradas con un formato A_B.JPG donde A es un código que recibo por $_REQUEST y B es un número de orden, ejemplo:

120000_1.jpg
120000_2.jpg
120000_3.jpg
etc..
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de italo
Val: 920
Bronce
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Multiple File Upload

Publicado por italo (150 intervenciones) el 23/02/2019 05:00:38
Hola, primero que nada deberias de probar siempre con cosas basicas y tratar de entender la logica...

aqui le falta la gestion de la extension pero ya la tienes lista, basta que lo agregues donde corresponde.

1
2
3
4
5
6
7
8
9
10
11
12
//$_FILES["uploaded_file"]["name"]
$nombres_array = array("nombre_file_A", "nombre_file_B", "nombre_file_C", "nombre_file_D", "nombre_file_E", "nombre_file_F");
 
$count_nombres_array = count($nombres_array);
 
//recibes el  $_REQUEST; (ejemplo)
$parm_request = "120000";
 
 for($i = 0; $i < $count_nombres_array; $i++) {
 
   echo $parm_request."_".$i."_".$nombres_array[$i].".jpg<br>";
}

resultado:

1
2
3
4
5
6
120000_0_nombre_file_A.jpg
120000_1_nombre_file_B.jpg
120000_2_nombre_file_C.jpg
120000_3_nombre_file_D.jpg
120000_4_nombre_file_E.jpg
120000_5_nombre_file_F.jpg

deberias de agregar a cada file la hora y fecha (para evitar duplicados).

adapta y prueba en test.

si tienes problemas, escribe todo tu codigo (la parte del form donde haces la seleccion del file y nombre de param request)

salud2.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Multiple File Upload

Publicado por Ricardo (12 intervenciones) el 23/02/2019 06:31:42
Ante todo gracias por tu ayuda italo.
Creo que tu código no funciona de igual forma cuando el "echo" se reemplaza por "move_uploades_file", como sigue:

1
2
3
4
5
6
7
8
9
$nombres_array = array("nombre_file_A", "nombre_file_B", "nombre_file_C", "nombre_file_D", "nombre_file_E", "nombre_file_F");
$count_nombres_array = count($nombres_array);
//recibes el  $_REQUEST; (ejemplo)
$parm_request = "120000";
for($i = 0; $i < $count_nombres_array; $i++) {
       $destino = $parm_request."_".$i."_".$nombres_array[$i].".jpg";
	move_uploaded_file($_FILES['file-es']['tmp_name'][$i],'fotos_tmp/'.$destino);
	//echo $parm_request."_".$i."_".$nombres_array[$i].".jpg<br>";
}

Produciendo como resultado para la subida de 3 archivos solo:
120000_0_nombre_file_A.jpg

O sea, sigo igual.


Para el form de subida utilizo el plugin bootstrap-file input
http://plugins.krajee.com/file-basic-usage-demo

Este es el trozo de código con la etiqueta input:

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
<div class="row">
            <div class="col-lg-12">
              <div class="p-2">
                <div class="imagen_carga-publicar">
                  <input id="file-es" name="file-es[]" type="file" data-browse-on-zone-click="true" accept=".jpg,.jpeg,.gif,.png" multiple>
                </div>
              </div>
              <script>
                var $el1 = $("#file-es");
                $el1.fileinput({
                    theme: "fas",
                    //uploadUrl: "../nv/p_ph1.php?cod_pub=1357982",
                    uploadUrl: <?PHP echo $p_ph1; ?>,
                    uploadAsync: true,
                    showUpload: false, // hide upload button
                    showRemove: false,
                    overwriteInitial: false, // append files to initial preview
                    minFileCount: 1,
                    maxFileCount: 25,
                    maxFileSize: 5000,
                    initialPreviewAsData: true,
                }).on("filebatchselected", function(event, files) {$el1.fileinput("upload"); });
              </script>
            </div>
            <div class="col-lg-6 col-md-6 col-sm-6 col-12 mx-auto text-center py-2">
              <button type="button" class="btn btn-success btn-sm mx-auto green w-40">PUBLICAR</button>
            </div>
          </div>
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Multiple File Upload

Publicado por Ricardo (12 intervenciones) el 23/02/2019 16:29:09
Como solo permito subir hasta 25 fotos, me pareció que tu código adaptado como sigue podría funcionar:

1
2
3
4
5
6
7
$nombres_array = array("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");
$count_nombres_array = count($nombres_array);
$parm_request = "120000";
for($i = 0; $i < $count_nombres_array; $i++) {
	$destino = $parm_request."_".$nombres_array[$i].".jpg";
	move_uploaded_file($_FILES['file-es']['tmp_name'][$i],'fotos_tmp/'.$destino);
}

pues, tampoco funciona ...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de italo_pm
Val: 920
Bronce
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Multiple File Upload

Publicado por italo_pm (150 intervenciones) el 24/02/2019 05:25:10
Hola, claro que no te funcionara, el mio era solo un ejemplo para que entiendas la logica ya que ahi radico el principal problema.

a manera de ejemplo te dejo un codigo que funciona.

Deberas crear una carpeta con el nombre "tu_carpeta"

la estructura sera:

tu_carpeta
- adjunto_form.php
- exec_adjunto_form.php

file: adjunto_form.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!DOCTYPE html>
<html>
<body>
 
<form action="exec_adjunto_form.php" method="post" enctype="multipart/form-data">
  selecciona files:
  <br>
  <input type="file" name="file-es[]">
  <br>
  <input type="file" name="file-es[]">
  <br>
  <input type="file" name="file-es[]">
  <br>
  <input type="text" name="codigo">
  <br>
  <input type="submit" value="Subir files" name="submit">
</form>
 
</body>
</html>

file: exec_adjunto_form.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
<?php
 
//print_r($_POST);
//print_r($_FILES);
 
//recibo el codigo que identificara a los files.
$codigo = $_POST["codigo"];
echo "codigo recibido que identificara a los files: ".$codigo."<br>";
 
for($i=0;$i<count($_FILES["file-es"]["name"]);$i++) {
 
  //este sera el file que ira a la carpeta del server.
  $uploadfile=$_FILES["file-es"]["tmp_name"][$i];
 
  //este es el nombre del file que llega del usuario.
  $nombre_file=$_FILES["file-es"]["name"][$i];
  echo "<br>nombre file de usuario: ".$nombre_file."<br>";
 
  //esta es la carpeta de destino de tu server.
  $target_dir="tu_carpeta/";
 
  //aqui se prepara el file (ruta y nombre), ya que se debe incluir la ruta y el nombre para el move_uploaded_file.
  $target_file = $target_dir . $codigo."_".$i."_".$_FILES['file-es']["name"][$i];
  echo "<br> nombre file preparado (ruta y nombre) para el move_uploaded_file: ".$target_file."<br>";
 
  //aqui se personaliza el nombre del file (solo nombre)
  $nombre_personalizado = $codigo."_".$i."_".$_FILES['file-es']["name"][$i];
  echo "<br> nombre file personalizado: ".$nombre_personalizado."<br>";
 
  //ejecuto el upload del file.
  move_uploaded_file($uploadfile, $target_file);
 
}

resultado:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
codigo recibido que identificara a los files: codigo_personalizado
 
nombre file de usuario: aaa.txt
 
nombre file preparado (ruta y nombre) para el move_uploaded_file: tu_carpeta/codigo_personalizado_0_aaa.txt
 
nombre file personalizado: codigo_personalizado_0_aaa.txt
 
nombre file de usuario: bbb.txt
 
nombre file preparado (ruta y nombre) para el move_uploaded_file: tu_carpeta/codigo_personalizado_1_bbb.txt
 
nombre file personalizado: codigo_personalizado_1_bbb.txt
 
nombre file de usuario: ccc.txt
 
nombre file preparado (ruta y nombre) para el move_uploaded_file: tu_carpeta/codigo_personalizado_2_ccc.txt
 
nombre file personalizado: codigo_personalizado_2_ccc.txt

y la carpeta contendra:

1
2
3
4
tu_carpeta
codigo_personalizado_0_aaa.txt
codigo_personalizado_1_bbb.txt
codigo_personalizado_2_ccc.txt

en el ejemplo subo 3 files con nombres:

aaa.txt
bbb.txt
ccc.txt

y como codigo: codigo_personalizado

los nombres de los files seran:

1
2
3
codigo_personalizado_0_aaa.txt
codigo_personalizado_1_bbb.txt
codigo_personalizado_2_ccc.txt

lee el codigo las veces que sean necesarias, prueba en test, adapta el codigo al tuyo.

Si hay errores escribes cuales son y el codigo que has usado.


Salud2
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Multiple File Upload

Publicado por Ricardo (12 intervenciones) el 24/02/2019 06:43:17
Ante todo muchísimas gracias por tu valiosa colaboración.

En producción, he adaptado tu código, he adaptado no se cuantos ejemplo ya, y no hay forma de que esa variable $i haga su trabajo en el bucle for.
En este caso tu código exactamente igual, ya que nada tuve que cambiar:

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
//recibo el codigo que identificara a los files.
$codigo = intval($_REQUEST["cod_pub"]);
    $codigo = 120000;
//echo "codigo recibido que identificara a los files: ".$codigo."<br>";
 
for($i=0;$i<count($_FILES["file-es"]["name"]);$i++) {
 
  //este sera el file que ira a la carpeta del server.
  $uploadfile=$_FILES["file-es"]["tmp_name"][$i];
 
  //este es el nombre del file que llega del usuario.
  $nombre_file=$_FILES["file-es"]["name"][$i];
  //echo "<br>nombre file de usuario: ".$nombre_file."<br>";
 
  //esta es la carpeta de destino de tu server.
  $target_dir="fotos_tmp/";
 
  //aqui se prepara el file (ruta y nombre), ya que se debe incluir la ruta y el nombre para el move_uploaded_file.
  $target_file = $target_dir . $codigo."_".$i."_".$_FILES['file-es']["name"][$i];
  //echo "<br> nombre file preparado (ruta y nombre) para el move_uploaded_file: ".$target_file."<br>";
 
  //aqui se personaliza el nombre del file (solo nombre)
  $nombre_personalizado = $codigo."_".$i."_".$_FILES['file-es']["name"][$i];
  //echo "<br> nombre file personalizado: ".$nombre_personalizado."<br>";
 
  //ejecuto el upload del file.
  move_uploaded_file($uploadfile, $target_file);
}

y subiendo 4 fotos de ejemplo, llamadas:
peu1.jpg
peu2.jpg
peu3.jpg
peu4.jpg

Luego, en el servidor finalmente queda:

120000_0_peu1.jpg
120000_0_peu2.jpg
120000_0_peu3.jpg
120000_0_peu4.jpg

Con lo cual, queda demostrado que la variable $i es inútil en el bucle for.


Entonces se me ocurrió eliminar el bucle for y hacer algo "manual y básico" solo para ver que pasaba, con el siguiente código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$target_dir="fotos_tmp/";
 
$uploadfile=$_FILES["file-es"]["tmp_name"][0];
$nombre_file=$_FILES["file-es"]["name"][0];
$target_file = $target_dir . $codigo."_0_".$_FILES['file-es']["name"][0];
move_uploaded_file($uploadfile, $target_file);
 
$uploadfile=$_FILES["file-es"]["tmp_name"][1];
$nombre_file=$_FILES["file-es"]["name"][1];
$target_file = $target_dir . $codigo."_1_".$_FILES['file-es']["name"][1];
move_uploaded_file($uploadfile, $target_file);
 
$uploadfile=$_FILES["file-es"]["tmp_name"][2];
$nombre_file=$_FILES["file-es"]["name"][2];
$target_file = $target_dir . $codigo."_2_".$_FILES['file-es']["name"][2];
move_uploaded_file($uploadfile, $target_file);
 
$uploadfile=$_FILES["file-es"]["tmp_name"][3];
$nombre_file=$_FILES["file-es"]["name"][3];
$target_file = $target_dir . $codigo."_3_".$_FILES['file-es']["name"][3];
move_uploaded_file($uploadfile, $target_file);

El resultado, para el mismo juego de 4 fotos de entrada, es exactamente el mismo del ejercicio de arriba:

120000_0_peu1.jpg
120000_0_peu2.jpg
120000_0_peu3.jpg
120000_0_peu4.jpg

Sin duda esta fallando mi lógica, mi falta de entendimiento de estas instrucciones me esta haciendo ir por el camino equivocado.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de italo
Val: 920
Bronce
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Multiple File Upload

Publicado por italo (150 intervenciones) el 25/02/2019 03:27:22
Hola, pues al parecer algo esta fallando antes de que llegue a ejecutarse el codigo.

lo que seria interesante es que escribas el codigo de tu form (ya que solo has escrito la parte del form del upload)

de preciso, saber como esta compuesto tu form, deberia estar asi:

1
<form action="exec_adjunto_form.php" method="post" enctype="multipart/form-data">

ya que sin el parametro enctype="multipart/form-data" en el form, llegara solo un file asi pongas multiple y mas aun si se envian varios files.

por otra parte, (te aconseje que pruebes en test, probarlo o implementarlo en produccuion ya es bajo tu responsabilidad), en fase de test no se deben de "quitar //" los ECHO ya que precisamente para eso sirven, son los que ayudan al debbug y es necesario usarlos.

he agregado a manera de debbug, el dump del array $_FILES para obtener toda la informacion, con el siguiente codigo lo veras al inicio de la pagina que hace el upload.

1
2
3
4
//debbug de toda la info de los files: $_FILES.
echo '<pre>';
print_r($_FILES);
echo '</pre>';

deberas revisar sobre todo esta parte del debbug, donde esta los errores, el array error de te devuelve por cada file el codigo de error

1
2
3
4
[error] => Array
                (
                    [0] => 0
                )

lo mismo podras hacer con print_r($_POST); para saber toda la informacion que contiene el array $_POST

nuevamente agrego los files con el print_r($_FILES); y no borres los ECHO que hacen el debbug.

file: adjunto_form.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!DOCTYPE html>
<html>
<body>
 
<form action="exec_adjunto_form.php" method="post" enctype="multipart/form-data">
 
  selecciona files:
  <br>
  <input type="file" name="file-es[]">
  <br>
  <input type="file" name="file-es[]">
  <br>
  <input type="file" name="file-es[]">
  <br>
  <input type="file" name="file-es[]">
  <br>
  <input type="text" name="cod_pub">
  <br>
  <input type="submit" value="Subir files" name="submit">
</form>
 
</body>
</html>

file: exec_adjunto_form.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
<?php
 
//debbug de toda la info de los files: $_FILES.
echo '<pre>';
print_r($_FILES);
echo '</pre>';
 
//recibo el codigo que identificara a los files.
$codigo = intval($_REQUEST["cod_pub"]);
 
echo "debbug: codigo recibido que identificara a los files: ".$codigo."<br>";
 
for($i=0;$i<count($_FILES["file-es"]["name"]);$i++) {
 
  //este sera el file que ira a la carpeta del server.
  $uploadfile=$_FILES["file-es"]["tmp_name"][$i];
 
  //este es el nombre del file que llega del usuario.
  $nombre_file=$_FILES["file-es"]["name"][$i];
  echo "<br> debbug: nombre file de usuario: ".$nombre_file."<br>";
 
  //esta es la carpeta de destino de tu server.
  $target_dir="fotos_tmp/";
 
  //aqui se prepara el file (ruta y nombre), ya que se debe incluir la ruta y el nombre para el move_uploaded_file.
  $target_file = $target_dir . $codigo."_".$i."_".$_FILES['file-es']["name"][$i];
  echo "debbug: nombre file preparado (ruta y nombre) para el move_uploaded_file: ".$target_file."<br>";
 
  //aqui se personaliza el nombre del file (solo nombre)
  $nombre_personalizado = $codigo."_".$i."_".$_FILES['file-es']["name"][$i];
  echo "debbug: nombre file personalizado: ".$nombre_personalizado."<br>";
 
  //ejecuto el upload del file.
  move_uploaded_file($uploadfile, $target_file);
 
}

la carpeta se llama fotos_tmp

que tu form tenga el paramentro necesario: enctype="multipart/form-data"

1
<form action="exec_adjunto_form.php" method="post" enctype="multipart/form-data">

he subido 4 files (peu1.jpg, peu2.jpg, peu3.jpg, peu4.jpg)

y como cod_pub: 2712

y el resultado sera:

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
62
63
64
Array
(
    [file-es] => Array
        (
            [name] => Array
                (
                    [0] => peu1.jpg
                    [1] => peu2.jpg
                    [2] => peu3.jpg
                    [3] => peu4.jpg
                )
 
            [type] => Array
                (
                    [0] => image/jpeg
                    [1] => image/jpeg
                    [2] => image/jpeg
                    [3] => image/jpeg
                )
 
            [tmp_name] => Array
                (
                    [0] => /storage/ssd5/245/7752245/tmp/phpSYC410
                    [1] => /storage/ssd5/245/7752245/tmp/phppQHDOZ
                    [2] => /storage/ssd5/245/7752245/tmp/phpWvlfBY
                    [3] => /storage/ssd5/245/7752245/tmp/phpulrTnX
                )
 
            [error] => Array
                (
                    [0] => 0
                    [1] => 0
                    [2] => 0
                    [3] => 0
                )
 
            [size] => Array
                (
                    [0] => 2974
                    [1] => 2475
                    [2] => 3057
                    [3] => 2631
                )
 
        )
 
)
debbug: codigo recibido que identificara a los files: 2712
 
debbug: nombre file de usuario: peu1.jpg
debbug: nombre file preparado (ruta y nombre) para el move_uploaded_file: fotos_tmp/2712_0_peu1.jpg
debbug: nombre file personalizado: 2712_0_peu1.jpg
 
debbug: nombre file de usuario: peu2.jpg
debbug: nombre file preparado (ruta y nombre) para el move_uploaded_file: fotos_tmp/2712_1_peu2.jpg
debbug: nombre file personalizado: 2712_1_peu2.jpg
 
debbug: nombre file de usuario: peu3.jpg
debbug: nombre file preparado (ruta y nombre) para el move_uploaded_file: fotos_tmp/2712_2_peu3.jpg
debbug: nombre file personalizado: 2712_2_peu3.jpg
 
debbug: nombre file de usuario: peu4.jpg
debbug: nombre file preparado (ruta y nombre) para el move_uploaded_file: fotos_tmp/2712_3_peu4.jpg
debbug: nombre file personalizado: 2712_3_peu4.jpg

prueba en test, adapta a tu codigo, si te da error escribe todo el codigo , sea del form (al menos el form y la parte del upload y el input cod_pub) y de la parte server donde procesas todo el codigo php.

salud2
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Multiple File Upload

Publicado por Ricardo (12 intervenciones) el 25/02/2019 17:06:08
Hola italo,
Perdón, cuando me refiero que pruebo "en producción" es que lo hago directamente con mi servidor de hosting, pero no en mi dominio en producción sino en un sub_dominio de pruebas, no hay peligro.

No puedo poner todo el código por que es muy grande, ya que utilizo el plugin de Kartik Visweswaran para subir múltiples archivos en forma simultanea, lo cual crea una moderna e intuitiva interface y experiencia similar a Facebook, etc.

Mi código esta basado exactamente en este ejemplo (ventanas negras con código):
http://minubeinformatica.com/articulos/programacion/como-utilizar-el-plugin-fileinput-bootstrap-para-la-subida-masiva-de-archivos
Por este motivo tampoco puedo dejar los "echo" ya que me generan un error.

Y todo funciona perfecto, sube todos los archivos que quiera en forma simultanea ya que luego "los veo" en mi servidor, en la carpeta temporal definida. El problema viene al final, cuando simplemente necesito "renombrar" los archivos subidos a un formato especifico que yo necesito, eso es todo y fue lo que dió origen a mi consulta en este foro.

Se que es muy tedioso tratar de reproducir el error para darme una mano, nunca pensé que el problema pudiera estar en otra sección del código, todo parecía indicar que era algo simple en el subindice del bucle for, ahora ya no se ni por donde buscar
Seguiré mirando ya que debo dejarlo funcionando..
Muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de italo_pm
Val: 920
Bronce
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Multiple File Upload

Publicado por italo_pm (150 intervenciones) el 26/02/2019 04:30:59
Hola Ricardo, primero que nada, se hubiera ganado tiempo si desde el primer post hubieras escrito que era un plugin para bootstrap, no soy profesor, pero lo primero que se hace normalmente o se deberia de hacer es ir a la pagina del plugin y comerte toda la documentacion y utilizar los ejemplo que hay ahi ya que son oficiales (asi como los ejemplo de bootstrap en su web), en la pagina del autor en la documentacion hay un apartado que habla justo de como enviar multiples files. http://plugins.krajee.com/file-input#ajax-sync

en dicho apartado esta la informacion sobre el envio de files de manera Asynchronous Uploads o Synchronous Uploads.

1
2
3
4
5
Asynchronous Uploads
propiedad: uploadAsync: true,
 
This is the default mode, whereby the uploadAsync property is set to true
Note: In asynchronous mode, you will ALWAYS receive a single FILE on your server action that processes the ajax upload. When uploading multiple files, the asynchronous mode allows triggering parallel server calls for each file upload.

que era tu caso ya que en tu codigo esta escrito con uploadAsync: true, y por tanto siempre se procesaria un solo file, por este motivo al for escribia el valor del primer file recibido, pero realizaba todo el loop, por eso todos los files tenian el "0" como parte del nombre.

Para realizar el upload de varios files se debera escribir la propriedad uploadAsync: false, con el FALSE y de esa manera sera el envio en manera Synchronous Uploads

1
2
3
4
Synchronous Uploads
propiedad: uploadAsync: false,
 
In this mode, the uploadAsync property is set to false. This will trigger just one batch upload call to the server and send files from client to server as an array object.

en todo caso, un jalon de orejas ya que en la misma guia que habias enlasado (esa en espanol) el ejemplo tambien esta en uploadAsync: false, sin embargo tu codigo esta con uploadAsync: true, en fin, espero que esto te sirva siempre ya que deberas usar estos pasos basicos cuando desees aplicar un plugin u otra cosa en tus proyectos. espero que no me digas que era un problema del idioma ya en ambas guias estaba escrito (y hay miles de servicios que te traducen las webs), se debe de leer siempre la documentacion ya que el desarollador se ha matado muchas horas para escribirla (mas horas de las que se empleo la escritura del plugin), bueno, regresando a nosotros....

tu problema esta en aquella propieda que debes de ponerla en FALSE uploadAsync: false,

a modo de ejemplo y curiosidad hice este ejemplo.

file temp_adjunto_form.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
<!-- Bootstrap CSS -->
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
 
<!-- Awesome CSS -->
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.5.0/css/all.css" integrity="sha384-B4dIYHKNBt8Bc12p+WXckhzcICo0wtJAoU8YZTY5qE0Id1GSseTk6S+L3BlXeVIU" crossorigin="anonymous">
<link rel="stylesheet" href="https://netdna.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.css">
 
<!-- bootstrap fileinput css -->
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-fileinput/4.5.2/css/fileinput.css"/>
 
<!-- jquery -->
<script src="//code.jquery.com/jquery-3.3.1.min.js"></script>
<!-- jquery-ui -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
 
 
<!-- fileinput bootstrap -->
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-fileinput/4.5.2/js/fileinput.js"></script>
 
<div class="row">
  <div class="col-lg-12">
    <div class="p-2">
      <div class="imagen_carga-publicar">
      <!-- <input id="file-es" name="file-es[]" type="file" data-browse-on-zone-click="true" accept=".jpg,.jpeg,.gif,.png" multiple> -->
        <input id="file-es" name="file-es[]" type="file" multiple="multiple" data-browse-on-zone-click="true">
      </div>
    </div>
    <script>
      var $el1 = $("#file-es");
      $el1.fileinput({
          theme: "fas",
          //*
          //* inicio - opciones personalizadas
          //uploadUrl: "../nv/p_ph1.php?cod_pub=1357982",
          //uploadUrl: <?PHP //echo $p_ph1; ?>,
          uploadUrl: 'php/temp_exec_adjunto_form.php?cod_pub=11111', //* se recibe con $_REQUEST["cod_pub"] o $_GET["cod_pub"]
          //uploadAsync: true,
          uploadAsync: false,
          //uploadExtraData:{cod_pub:"1155"}, //* otra manera de enviar un dato, se recive con $_POST["cod_pub"]
          allowedFileExtensions: ["jpg","jpeg","gif","png"],
          //* final - opciones personalizadas
          //*
          showUpload: false, // hide upload button
          showRemove: false,
          overwriteInitial: false, // append files to initial preview
          minFileCount: 1,
          maxFileCount: 25,
          maxFileSize: 5000,
          initialPreviewAsData: true,
          
      }).on("filebatchselected", function(event, files) {$el1.fileinput("upload"); });

    </script>
    
  </div>
  <div class="col-lg-6 col-md-6 col-sm-6 col-12 mx-auto text-center py-2">
    <button type="button" class="btn btn-success btn-sm mx-auto green w-40">PUBLICAR</button>
  </div>
</div>


file temp_exec_adjunto_form.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
<?php
 
//debbug de toda la info de los files: $_FILES.
//echo '<pre>';
//print_r($_FILES);
//echo '</pre>';
 
//recibo el codigo que identificara a los files.
$codigo = intval($_REQUEST["cod_pub"]);
 
//echo "debbug: codigo recibido que identificara a los files: ".$codigo."<br>";
 
for($i=0;$i<count($_FILES["file-es"]["name"]);$i++) {
 
  //este sera el file que ira a la carpeta del server.
  $uploadfile=$_FILES["file-es"]["tmp_name"][$i];
 
  //este es el nombre del file que llega del usuario.
  $nombre_file=$_FILES["file-es"]["name"][$i];
  //echo "<br> debbug: nombre file de usuario: ".$nombre_file."<br>";
 
  //esta es la carpeta de destino de tu server.
  $target_dir="fotos_tmp/";
 
  //aqui se prepara el file (ruta y nombre), ya que se debe incluir la ruta y el nombre para el move_uploaded_file.
  $target_file = $target_dir . $codigo."_".$i."_".$_FILES['file-es']["name"][$i];
  //echo "debbug: nombre file preparado (ruta y nombre) para el move_uploaded_file: ".$target_file."<br>";
 
  //aqui se personaliza el nombre del file (solo nombre)
  $nombre_personalizado = $codigo."_".$i."_".$_FILES['file-es']["name"][$i];
  //echo "debbug: nombre file personalizado: ".$nombre_personalizado."<br>";
 
  //ejecuto el upload del file.
  if(move_uploaded_file($uploadfile, $target_file)) {
    //RESPUESTA - OK - FORMATO ARRAY PARA JSON
    $respuestajson = array('uploaded' => 'OK' );
  } else {
    //RESPUESTA - ERROR - FORMATO ARRAY PARA JSON
    $respuestajson = array('uploaded' => 'ERROR' );
  }
}
 
// Devolvemos el array asociativo en formato JSON.
echo json_encode($respuestajson);

sobre quitar // los echo, pues hay una explicacion del porque generar errores y es porque el plugin se esperar una respuesta del server, en este caso se la espera con el standard json (que trabaja solo con array) es por eso que los echo generaban errores (menos el echo del json_encode)

aqui selecciono 4 files y ya se ve que han sido subidos correctamente.

1_selecciono_files

aqui ya estan guardados con los respectivos nombres dinamicos:

el cod_pub que utilice es 11111, temp_exec_adjunto_form.php?cod_pub=11111

2_files_guardados

prueba nuevamente en test, adapta a tu codigo, si tienes errores escribe el codigo que pueda ayudar a identificar el problema.

salud2.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Multiple File Upload

Publicado por Ricardo (12 intervenciones) el 26/02/2019 15:08:38
Hola italo,
Solo agradecerte por tu excelente análisis y ejemplo, demás esta decir que ahora funciona perfecto.
No tuve en cuenta esa propiedad, no leí con suficiente atención los ejemplos y documentación del plugin (por cierto, mencioné que utilizaba este plugin en mi post del 23/02/2019 06:31:42) por lo que tengo muy bien ganado el tirón de orejas :))

Consulta aparte: te interesaría colaborar conmigo para dejar perfectamente implementado este componente en mi web? pago a acordar de por medio.
Como ves, este plugin tiene ricas opciones que me interesaría dejar operativas como por ejemplo: eliminar una foto, elegir como portada, etc.
Si no es de tu interés o no tienes tiempo lo comprendo perfectamente y por supuesto, te quedo muy agradecido por la ayuda desinteresada que ya me has brindado.
Saludos!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kathyu
Val: 1.802
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Multiple File Upload

Publicado por Kathyu (905 intervenciones) el 26/02/2019 15:15:58
Fino como siempre Italo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Multiple File Upload

Publicado por italo_pm (150 intervenciones) el 27/02/2019 01:30:46
hola Ricardo, que bueno que hayas logrado hacer funcionar tu codigo, por el momento no tengo tiempo, prefiero ayudar donde pueda, gracias de toda manera. la documentación de ese plugin es bastante extensa y hay de todo que esta documentado y hay muchos ejemplos y forma de utilizo. el mejor consejo que te puedo dar es aplicar todos los ejemplos de ese plugin, asi sean 50 o 60 o 70, pruebalos todos.


@Katchyu, trato de dar solo mi granito de arena =)

salud2
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar