Foros del Web » Programando para Internet » PHP »

upload multiple

Estas en el tema de upload multiple en el foro de PHP en Foros del Web. hla, estoy haciendo un upload de tres archivos con tres campos file llamados foto: Código: <form multipartformdata> <input type=file name=foto> <input type=file name=foto> <input type=file ...
  #1 (permalink)  
Antiguo 13/07/2006, 15:59
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 1 mes
Puntos: 535
upload multiple

hla, estoy haciendo un upload de tres archivos con tres campos file llamados foto:

Código:
<form multipartformdata>
<input type=file name=foto>
<input type=file name=foto>
<input type=file name=foto>
<submit>
</form>
Código del upload:

Código:
//***********************************************************************
$cantidad = 3;
for($i=0;$i<$cantidad;$i++){
	$fnombre = $_FILES['foto']['name'][$i];
	$fnombre_tmp = $_FILES['foto']['tmp_name'][$i];
	$ftipo = $_FILES['foto']['type'][$i];
	$fpeso = $_FILES['foto']['size'][$i];
	$fdestino = $_SERVER['DOCUMENT_ROOT'] . "/images_noticias";
	echo $fdestino."/".$fnombre . "<br>";
//	exit;
//	copy($fnombre_tmp, $fdestino."/".$fnombre);
}
//***********************************************************************
exit;
La línea en negrita me devuelve lo siguiente:


Código:
c:/archivos de programa/easyphp1-8/raiz_del_sitio/images_noticias/b
c:/archivos de programa/easyphp1-8/raiz_del_sitio/images_noticias/g
c:/archivos de programa/easyphp1-8/raiz_del_sitio/images_noticias/_ 
en donde b, g y _ son los tres primeros caracteres de los tres archivos que estoy intentando subir... ¿qué ocurre? ¿está mal recorrido el array?
__________________
...___...
  #2 (permalink)  
Antiguo 13/07/2006, 16:11
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Cambia:

<input type=file name=foto>

Por:

<input type=file name=foto[]>
  #3 (permalink)  
Antiguo 13/07/2006, 16:16
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 1 mes
Puntos: 535
Gracias!!!!
Esto si que me sobrepasó en cuanto a su "similitud" con el ASP ¿eh?
No puedo creerlo que cambie tanto (en realidad que deba modificar mi forma de pensar el html =)

¿O sea que todo campo de formulario que lo quiera usar para rescatarlo tipo array (por llamarse todos de la misma manera) los debo llamar nombre[]?
__________________
...___...
  #4 (permalink)  
Antiguo 14/07/2006, 06:44
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Iniciado por Al Zuwaga
Gracias!!!!
Esto si que me sobrepasó en cuanto a su "similitud" con el ASP ¿eh?
No puedo creerlo que cambie tanto (en realidad que deba modificar mi forma de pensar el html =)

¿O sea que todo campo de formulario que lo quiera usar para rescatarlo tipo array (por llamarse todos de la misma manera) los debo llamar nombre[]?
Así es .. indicando "[]" como parte del nombre de un elemento de un formulario HTML lo entendrá PHP como un "array".

Y como array que es .. lo recorres con un bucle .. normalemnte con un foreach() te sobra:

Código PHP:
foreach ($_FILES['foto'] as $fotografias){
   
$name_original=$fotografias['name'];
   
$name_temporal=$fotografias['tmp_name'];
   
// etc...

Con el foreach() te evitas andar contando los elementos "tipo array" que pudieras tener (nos aprovechamos que se genera un array autonumérico con [] ...)

EDITADO: NO se puede usar un foreach() de esta forma .. la estructura del array no es aplicable para usar directamente un foreach, habría que hacer algo como la prouesta de:

Cita:
phpuser at gmail dot com
26-May-2005 08:09
When uploading multiple files, the $_FILES variable is created in the form:

Array
(
[name] => Array
(
[0] => foo.txt
[1] => bar.txt
)

[type] => Array
(
[0] => text/plain
[1] => text/plain
)

[tmp_name] => Array
(
[0] => /tmp/phpYzdqkD
[1] => /tmp/phpeEwEWG
)

[error] => Array
(
[0] => 0
[1] => 0
)

[size] => Array
(
[0] => 123
[1] => 456
)
)

I found it made for a little cleaner code if I had the uploaded files array in the form

Array
(
[0] => Array
(
[name] => foo.txt
[type] => text/plain
[tmp_name] => /tmp/phpYzdqkD
[error] => 0
[size] => 123
)

[1] => Array
(
[name] => bar.txt
[type] => text/plain
[tmp_name] => /tmp/phpeEwEWG
[error] => 0
[size] => 456
)
)

I wrote a quick function that would convert the $_FILES array to the cleaner (IMHO) array.

Código PHP:
<?php

function reArrayFiles(&$file_post) {

   
$file_ary = array();
   
$file_count count($file_post['name']);
   
$file_keys array_keys($file_post);

   for (
$i=0$i<$file_count$i++) {
       foreach (
$file_keys as $key) {
           
$file_ary[$i][$key] = $file_post[$key][$i];
       }
   }

   return 
$file_ary;
}

?>

Now I can do the following:

<?php

if ($_FILES['upload']) {
   
$file_ary reArrayFiles($_FILES['ufile']);

   foreach (
$file_ary as $file) {
       print 
'File Name: ' $file['name'];
       print 
'File Type: ' $file['type'];
       print 
'File Size: ' $file['size'];
   }
}

?>

Otro detalle .. no uses copy() .. eso te dará muchos problemas .. Recueda que PHP impone límites a que rutas de archivos puede acceder en forma absoluta (una configuración "safe mode" de PHP no te dejaría usar esa función en ese caso). Para solventar ese probleam PHP implementa para este caso la función: move_uploaded_file() .. que se usa igual que copy pero sólo "muve" archivos desde el directorio temporal donde pHP sube todo archivo que pasa por el hacia su destino definitivo (digamos que esa es la "puerta" abierta con permisos para acceder sólo a ese directorio pese que pueda tener otras restricciones PHP de acceso a directorios).

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.

Última edición por Cluster; 14/07/2006 a las 12:13
  #5 (permalink)  
Antiguo 14/07/2006, 10:09
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 1 mes
Puntos: 535
Genial, como siempre todo un placer que usted responda ;)
En un rato me pongo a adaptar el script para dejarlo ocmo me comentás.

(Si tengo problemas regreso por aquí ñ_ñ)

Gracias
__________________
...___...
  #6 (permalink)  
Antiguo 14/07/2006, 10:31
Avatar de seik!  
Fecha de Ingreso: mayo-2006
Mensajes: 492
Antigüedad: 17 años, 10 meses
Puntos: 6
yo necesito esto mismo! pero no me funciona ...

me podrian explicar mejor el ejemplo?
seria bueno si pueden poner un codigo..
gracias;)
__________________
sEIK! -Chile-
Analista Programador.
  #7 (permalink)  
Antiguo 14/07/2006, 10:36
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 1 mes
Puntos: 535
dejá que adapto el script y te paso un ejemplo, pero dame un tiempo (que será durante el día de hoy)
__________________
...___...
  #8 (permalink)  
Antiguo 14/07/2006, 10:43
Avatar de seik!  
Fecha de Ingreso: mayo-2006
Mensajes: 492
Antigüedad: 17 años, 10 meses
Puntos: 6
gracias :D espero ... sino lo implemento para el lunes ;)
__________________
sEIK! -Chile-
Analista Programador.
  #9 (permalink)  
Antiguo 14/07/2006, 11:11
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 1 mes
Puntos: 535
Por quí regreso con problemas ñ_ñ (y con un cuestionamiento)


Código:
foreach ($_FILES['foto'] as $fotografias){
	$destino = $_SERVER['DOCUMENT_ROOT'] . "/images_noticias/";
	$name_original = $id_noticia . "_" . $fotografias['name'];
	$name_temporal = $fotografias['tmp_name'];
	$tipo = $fotografias['type'];
	$peso = $fotografias['size'];
//	$fepigrafe = $_POST['epigrafe'][$i];
	move_uploaded_file($name_temporal, $destino.$name_original);
}
El código me da errores. Me dice que:
Undefined index: name (tmp_name, type y size)


Ahora el cuestionamiento: cada "foto" va acompañada de un epígrafe (que lo tomo de un input text llamado epigrafe como se ve en la línea comentada)
Si uso el foreach en vez del for que implementé originalemnte, no podría (o yo no sabría cómo) asociar cada epígrafe a la foto que le corresponde!

Cómo lo ves? En este caso si se debería usar un for?
__________________
...___...
  #10 (permalink)  
Antiguo 14/07/2006, 12:08
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Si uso el foreach en vez del for que implementé originalemnte, no podría (o yo no sabría cómo) asociar cada epígrafe a la foto que le corresponde!
En ese caso es la misma filosofía del "array" .. Tu "input" con el epigrafe debe ser con name="epigrafe[]" .. pero como bien dices el foreach() para este caso no es lo ideal. Usa tu for() original .. así obtienes el indice que necesitas para aplicarlo a ambos arrays que generas.

Código PHP:
for($i=0;$i<=$count($_FILES['foto']['name']);$i++){
    
$nombre $_FILES['foto']['name'][$i];
    
$nombre_tmp $_FILES['foto']['tmp_name'][$i];
    
$tipo $_FILES['foto']['type'][$i];
    
$peso $_FILES['foto']['size'][$i];
    
$destino $_SERVER['DOCUMENT_ROOT'] . "/images_noticias";
             
$epigrafe $_POST['epigrafe'][$i];
    
move_uploaded_file($nombre_temporal$destino.$nombre);
    

Sólo añadí el "count()" para contar automáticamente los n° de elementos que el array generado tenga .. (Corregí mi "error" .. ya estaba haciendo count($_FILES['foto']) cuando la estructura del array generado no es esa .. así que hay que meterse al atributo .. a uno cualquiera: count($_FILES['foto']['name']) por ejemplo .. )

----------
El código me da errores. Me dice que:
Undefined index: name (tmp_name, type y size)

Esto no funcionó la estructura del array generada es otra. En los comentarios de los usuarios del capítulo de php.net sobre "upload múltiple" .. el último a la fecha detalla la estructura del array y un ejemplo como para "re-genear" el array para trabajarlo con un "foreach()" simple .. (edité y pegué en mi anterior respuesta para explicar mi "error" y su "solución" o como aplicarlo).

Por lo menos "ilustra" por qué no me funcionó y como "solventarlo" .. pero prácticamente con un "for()" sobra.

http://www.php.net/manual/en/feature...d.multiple.php

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.

Última edición por Cluster; 14/07/2006 a las 12:14
  #11 (permalink)  
Antiguo 28/07/2006, 18:45
 
Fecha de Ingreso: julio-2006
Ubicación: Buenos Aires-Cap. Fed.
Mensajes: 12
Antigüedad: 17 años, 8 meses
Puntos: 0
por si no lo resolviste , te envio una alternativa que uso para subir multiples archivos , espero que sirva de algo, salu2.


PD: LA CARPETA "ARCHIVOS" DONDE SE SUBIRAN LOS MISMOS DEBE ESTAR PREVIAMENTE CREADA EN EL SERVIDOR


<?php

$path=$_SERVER['DOCUMENT_ROOT'].'/archivos/';

/* Destination of Upload files..use / insted of \\\\\\\\ in UNIX */
define($path,'cena2005');

/* Signamos a UPLOAD_NO la cantidad de infiles que queremos hacer */
define(UPLOAD_NO, 10);

if($REQUEST_METHOD!=POST)
{
print '<form enctype=multipart/form-data method=POST>';
print '<INPUT TYPE=hidden name=MAX_FILE_SIZE value=100000>';

for($i=1; $i<=UPLOAD_NO; $i++)
{
echo '<input type=file name=infile';echo$i;echo'>';

if($i%2==0)
print'<br>';
}
echo '<br><br><input type=submit value=Subir></form>';
}
else
{
/* handle uploads */
$noinput = true;
for($i=1; $noinput && ($i<=UPLOAD_NO); $i++)
{
if(${infile.$i}!=none) $noinput=false;
}
if($noinput)
{
print '<big><B>Error uploading. Intente de Nuevo.</B></big>';
exit();
}
echo'<p align=center><b><font size=4>Subida Satisfactoria<br>';

echo'<table border=1 width=84% height=52 bordercolorlight=#008080 bordercolordark=#008080>
<tr>
<td width=14% bgcolor=#008000 height=21><font color=#FFFFFF><b>Sn</b></font></td>
<td width=52% bgcolor=#008000 height=21><font color=#FFFFFF><b>Filename</b></font></td>
<td width=34% bgcolor=#008000 height=21><font color=#FFFFFF><b>Size</b></font></td>
</tr>';

for($i=1; $i<=UPLOAD_NO; $i++)
{

$just=filesize(${infile.$i});
$fp_size[i] = $just;
// Este es el Peso del Archivo echo$just;

if(${infile.$i}!=none &&
copy(${infile.$i}, $path .'/'.${infile.$i._name})
// move_uploaded_file ( $_FILES [ '${infile.$i}' ][ '${infile.$i._name} '], DESTINATION . '/' . $_FILES [ '${infile.$i}' ][ '${infile.$i._name}' ])
&& unlink(${infile.$i}))
{

echo'<tr>

<td width=14% height=19>'; echo$i; echo'</td>
<td width=52% height=19>'; echo${infile.$i._name}; echo'</td>
<td width=34% height=19>'; echo$fp_size[i]; echo'</td>
</tr>
';
}
}
echo '</table>';
}
?>
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 14:13.