Well, it seems the value, or val()
, returned by the element is the name of only the last file selected. To work around this, it might be wise to use the nature of the multiple-change events:
$('input:file[multiple]').change(
function(){
$('ul').append($('<li />').text($(this).val()));
});
JS Fiddle demo.
And either output the names to a list (as in the example), or append the latest value to an array, or, possibly, use/create hidden inputs to store the filenames as you feel would best suit your application.
To access the file-names (as well as last modified date, file-size...) you can (tested in Chromium 12/Ubuntu 11.04) use the following:
$('input:file[multiple]').change(
function(e){
console.log(e.currentTarget.files);
});
JS Fiddle demo.
Edited to make the above slightly more useful and, hopefully, demonstrative:
$('input:file[multiple]').change(
function(e){
console.log(e.currentTarget.files);
var numFiles = e.currentTarget.files.length;
for (i=0;i<numFiles;i++){
fileSize = parseInt(e.currentTarget.files[i].fileSize, 10)/1024;
filesize = Math.round(fileSize);
$('<li />').text(e.currentTarget.files[i].fileName).appendTo($('#output'));
$('<span />').addClass('filesize').text('(' + filesize + 'kb)').appendTo($('#output li:last'));
}
});
JS Fiddle demo.
The final code-block updated, due to changes in Webkit, Chrome 24 (though possibly from earlier), by nextgentech in comments, below:
$('input:file[multiple]').change(
function(e){
console.log(e.currentTarget.files);
var numFiles = e.currentTarget.files.length;
for (i=0;i<numFiles;i++){
fileSize = parseInt(e.currentTarget.files[i].size, 10)/1024;
filesize = Math.round(fileSize);
$('<li />').text(e.currentTarget.files[i].name).appendTo($('#output'));
$('<span />').addClass('filesize').text('(' + filesize + 'kb)').appendTo($('#output li:last'));
}
});
JS Fiddle demo.