2012-10-20 17 views
24
var fd = new FormData(); 
fd.append("fileToUpload", document.getElementById('fileToUpload').files[0]); 
var xhr = new XMLHttpRequest(); 
xhr.open("POST", "uph.php"); 
xhr.send(fd); 

uph.php:caricamento di più file utilizzando formdata()

var_dump($_FILES['fileToUpload']); 

Questo funziona, ma ovviamente solo per il files[0]. Come farlo funzionare per il file scelto?

Ho provato a rimuovere il [0], ma non ha funzionato.

risposta

11

Devi solo usare fileToUpload[] invece di fileToUpload:

fd.append("fileToUpload[]", document.getElementById('fileToUpload').files[0]); 

e restituirà un array con più nomi, dimensioni, ecc ...

42

Dovete ottenere la lunghezza dei file da aggiungere in JS e poi inviarlo tramite richiesta AJAX come di seguito

//JavaScript 
var ins = document.getElementById('fileToUpload').files.length; 
for (var x = 0; x < ins; x++) { 
    fd.append("fileToUpload[]", document.getElementById('fileToUpload').files[x]); 
} 

//PHP 
$count = count($_FILES['fileToUpload']['name']); 
for ($i = 0; $i < $count; $i++) { 
    echo 'Name: '.$_FILES['fileToUpload']['name'][$i].'<br/>'; 
} 
+2

perché filetoupload []? – Phoenix

+0

Non ha funzionato per me. Immagino dipenda da come il tuo modulo multipart sarà gestito lato server. – fubbe

+7

[Secondo MDN 'Come per i dati regolari dei moduli, è possibile aggiungere più valori con lo stesso nome. Ad esempio (ed essendo compatibile con le convenzioni di denominazione di PHP aggiungendo [] al nome): '. Vedi Esempio 3] (https://developer.mozilla.org/en-US/docs/Web/API/FormData/append) @Phoenix – 0xcaff

21

La strada da percorrere con javascript:

var data = new FormData(); 

$.each($("input[type='file']")[0].files, function(i, file) { 
    data.append('file', file); 
}); 

$.ajax({ 
    type: 'POST', 
    url: '/your/url', 
    cache: false, 
    contentType: false, 
    processData: false, 
    data : data, 
    success: function(result){ 
     console.log(result); 
    }, 
    error: function(err){ 
     console.log(err); 
    } 
}) 

Se si chiama data.append ('file', file) più volte la richiesta conterrà una serie di file.

Io utilizzando node.js e multipart gestore middleware multer ottenere i dati come segue:

router.post('/trip/save', upload.array('file', 10), function(req, res){ 
    // Your array of files is in req.files 
} 
+1

'... Se si chiama data.append ('file', file) multiple volte la tua richiesta conterrà un array di file ... 'Mi ha salvato ore di disperazione, soprattutto perché sentivo che il nome dovrebbe essere' file [] ', ma usando solo' file' e chiamando più volte ha funzionato, grazie! – bourgeois247

+1

Amico, sei una leggenda, lo stavi cercando da mattina grazie allot man – Kannan

+1

Ho provato l'esempio, ma quando ho var_dumped, restituisce sempre l'ultima immagine del set. Ho cambiato: 'data.append ('file', file)' a 'data.append ('file', i)', che ha funzionato per me. –

Problemi correlati