2010-07-09 16 views
12

Aquí está el código que tengo, y me pregunto qué estoy haciendo mal que no muestra el nombre.HTML 5 archivo de varias carga con PHP

<form action = "self.php" method="post" enctype="multipart/form-data"> 
<input type="file" name="imageURL[]" id="imageURL" multiple="" /> 
<input type="submit" value="submit" name="submit" /> 
</form> 

Y la información de procesamiento que no está funcionando:

foreach ($_FILES['imageURL'] as $files[]) { 
    echo $files['file']; 
} 

Editar:

Al cambiar mi bucle foreach para:

foreach ($_FILES['imageURL'] as $file) { 
    echo $file['name']; 
} 

Todavía nada imprime .

Sin embargo, cuando hago algo como esto:

foreach ($_FILES['imageURL']['name'] as $filename) { 
    echo $filename; 
} 

El nombre del archivo se imprime. Sin embargo, no sé lo que eso implica.



ACTUALIZACIÓN resuelto:

Como vinculado a por John Conde, la matriz de entrelazado estructura es diferente al cargar varios archivos que al subir un solo archivo. Para usar foreach, debemos reestructurar la matriz.

$files=array(); 
$fdata=$_FILES['imageURL']; 
if(is_array($fdata['name'])){ 
for($i=0;$i<count($fdata['name']);++$i){ 
     $files[]=array(
    'name' =>$fdata['name'][$i], 
    'type' => $fdata['type'][$i], 
    'tmp_name'=>$fdata['tmp_name'][$i], 
    'error' => $fdata['error'][$i], 
    'size' => $fdata['size'][$i] 
    ); 
    } 
}else $files[]=$fdata; 

Ahora podemos usar foreach para recorrer:

foreach ($files as $file) { 
    echo $file['name']; 
} 
+0

El código en "actualización resuelta" es bastante pobre. is_array ($ fdata ['name']) siempre evaluará falso, lo que significa que la mayoría del ejemplo nunca se ejecuta. Ver la respuesta aceptada en esta página en su lugar. –

Respuesta

14

Trate

foreach ($_FILES['imageURL'] as $file) { 
    echo $file['name']; 
} 

ACTUALIZACIÓN:

Google encontró this tutorial que pueden ayudarle a

+5

O 'print_r ($ _ FILES);' si la estructura no está clara. –

+0

Parece que no funciona, nada se repite. – kylex

+0

¡ACTUALIZACIÓN: brillante! ese era el problema. La estructura de la matriz es fundamentalmente diferente, lo que impide que foreach bucle sobre los archivos correctamente. Qué manera tan horrible de hacer eso, me sorprende que no haya una función preconfigurada en PHP para encargarse de esto de alguna manera ... – kylex

1

Quizás estoy equivocado, pero no configuré multiple="" ¿desactivar cargas múltiples? Sólo tiene que utilizar multiple por sí mismo, como se muestra en la HTML5 spec o, para la compatibilidad con XHTML, multiple="multiple":

<input type="file" name="imageURL[]" id="imageURL" multiple /> 
+0

Una buena idea, pero no el problema. De hecho, la sección de hacks de Firefox muestra múltiples como multiple = "" – kylex

3

En lugar de utilizar por() y contando el número de elementos de la matriz, se puede utilizar una más elegante foreach ()

$files=array(); 
$fdata=$_FILES['file']; 
if(is_array($fdata['name'])){ 
    foreach ($fdata['name'] as $i => $d) { 
     $files[] = array(
     'name' => $d, 
     'tmp_name' => $fdata['tmp_name'][$i] 
     ); 
    } 
} 
else $files[]=$fdata;