Upload multiples arxius
Quan s'utilitza l'atribut multiple al camp d'entrada i es posa [] al seu nom (name="fileToUpload[]"), l'estructura de l'array $_FILES canvia i s'organitza de manera diferent a la d'una sola pujada.
Per tal de simplificar la gestió, aquí teniu un exemple que integra tant el formulari com el tractament en un sol fitxer, i posteriorment, un script de tractament (el upload2.php de l'exemple) amb una funció que reorganitza l'array per facilitar la feina amb múltiples fitxers.
Exemple "All in one"
Aquest codi mostra el formulari i, en cas d'enviament, itera l'array $_FILES amb la seva estructura original (agrupada per propietat).
index.php
<?php
// ----------------------------------------------------
// 1. Lògica de Processament de l'Upload (PHP)
// ----------------------------------------------------
$missatge = "";
$dades_fitxers = [];
// Comprovem si s'ha enviat el formulari amb el mètode POST i si hi ha fitxers.
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['fileToUpload'])) {
$fitxers_a_pujar = $_FILES['fileToUpload'];
// Comprovem si s'ha seleccionat almenys un fitxer sense errors greus
if (is_array($fitxers_a_pujar['name']) && count($fitxers_a_pujar['name']) > 0 && $fitxers_a_pujar['name'][0] != "") {
$missatge = "<p style='color: green;'> **Fitxers rebuts amb èxit!** A continuació es mostren les propietats agrupades:</p>";
$dades_fitxers = $fitxers_a_pujar;
} elseif (is_array($fitxers_a_pujar['name']) && $fitxers_a_pujar['name'][0] == "" && $fitxers_a_pujar['error'][0] == UPLOAD_ERR_NO_FILE) {
$missatge = "<p style='color: orange;'> No s'ha seleccionat cap fitxer per a pujar.</p>";
} else {
$missatge = "<p style='color: red;'> S'ha produït un error en la pujada.</p>";
}
}
?>
<!DOCTYPE html>
<html lang="ca">
<head>
<meta charset="UTF-8">
<title>Upload Múltiple - Propietats $_FILES</title>
<style>
body { font-family: Arial, sans-serif; }
.resultat { border: 1px solid #ccc; padding: 15px; background-color: #f9f9f9; margin-top: 20px; }
.resultat h3 { color: navy; }
pre { background: white; padding: 10px; border: 1px dashed #aaa; }
</style>
</head>
<body>
<h1>Pujada Múltiple (Exemple `$_FILES` Agrupat)</h1>
<?php echo $missatge; ?>
<form action="" method="POST" enctype="multipart/form-data">
Selecciona arxius per pujar:<br/>
<input type="file" name="fileToUpload[]" id="fileToUpload" multiple><br/><br/>
<input type="submit" value="Pujar Arxius" name="submit">
</form>
<?php if (!empty($dades_fitxers)): ?>
<div class="resultat">
<h3>Estructura Original de `$_FILES['fileToUpload']`</h3>
<p>PHP agrupa les dades per propietat (name, type, size, etc.)
i, dins de cada propietat, posa l'índex de l'arxiu (0, 1, 2...).</p>
<pre>
<?php
// Bucle tal com s'ha demanat: Itera l'array per propietat i després per índex de fitxer
foreach($dades_fitxers as $propietat => $arxius) {
echo "\n*** PROPIETAT: [ " . strtoupper($propietat) . " ] ***\n";
// El segon bucle mostra el valor per a cada fitxer pujat
foreach ($arxius as $key => $value) {
// Mostrem el codi d'error en format llegible si no és 0 (èxit)
$valor_mostrat = ($propietat === 'error' && $value !== 0) ? "Codi $value (Error)" : $value;
echo "Fitxer [".$key."] - Valor: " . htmlspecialchars($valor_mostrat) . "\n";
}
}
?>
</pre>
</div>
<?php endif; ?>
</body>
</html>
Exemple: Reorganització array per fitxer
Tot i que l'estructura original és la que es genera, per a la majoria de tasques (validar o moure fitxers), és molt més còmode tenir un array on cada element sigui un fitxer complet (amb les seves 5 propietats). Podem reestructurar l'array amb aquesta funció que s'hauria de cridar al fitxer que gestioni l'enviament).
<?php
// Aquesta funció canvia l'estructura de $_FILES[name] de:
// [name] => [0 => 'fitxer_a', 1 => 'fitxer_b']
// [size] => [0 => 100, 1 => 200]
// A:
// [0] => [name => 'fitxer_a', size => 100]
// [1] => [name => 'fitxer_b', size => 200]
function reestructurar_files($file_post) {
if (!isset($file_post) || !is_array($file_post) || !isset($file_post['name'])) {
return [];
}
$file_count = count($file_post['name']);
$file_keys = array_keys($file_post);
$file_array = [];
for ($i = 0; $i < $file_count; $i++) {
foreach ($file_keys as $key) {
$file_array[$i][$key] = $file_post[$key][$i];
}
}
return $file_array;
}
// ----------------------------------------------------
// 1. Processament Principal
// ----------------------------------------------------
if (isset($_FILES['fileToUpload'])) {
// Cridem la funció per obtenir l'array reorganitzat
$fitxers_reorganitzats = reestructurar_files($_FILES['fileToUpload']);
echo "<h2>Dades de Fitxers Reorganitzats (Fàcil d'Iterar)</h2>";
echo "<p>Cada element de l'array ara representa un fitxer complet:</p>";
// Iterem l'array reorganitzat: $index és el número del fitxer
foreach ($fitxers_reorganitzats as $index => $fitxer) {
// Aquí es faria la validació i move_uploaded_file() per cada $fitxer
echo "<h3>Fitxer Nº " . ($index + 1) . ": " . htmlspecialchars($fitxer['name']) . "</h3>";
echo "<ul>";
foreach ($fitxer as $prop => $valor) {
// Mostrem les 5 propietats
$valor_mostrat = ($prop === 'error' && $valor !== 0) ? "Codi $valor (Error)" : $valor;
echo "<li><strong>" . htmlspecialchars($prop) . ":</strong> " . htmlspecialchars($valor_mostrat) . "</li>";
}
echo "</ul>";
// Exemple de com moure el fitxer individualment:
/*
if ($fitxer['error'] === UPLOAD_ERR_OK) {
$nom_segur = uniqid() . $fitxer['name'];
move_uploaded_file($fitxer['tmp_name'], "/ruta/de/desti/" . $nom_segur);
}
*/
}
} else {
echo "<p style='color: red;'> No s'han trobat dades de pujada. Assegura't que el formulari s'ha enviat correctament.</p>";
}
?>