Просто хотел добавить немного к большому ответу Рафаэля. Вот как получить PHP для создания того же $_FILES
, независимо от того, используете ли вы JavaScript.
HTML-форма:
<form enctype="multipart/form-data" action="/test.php"
method="post" class="putImages">
<input name="media[]" type="file" multiple/>
<input class="button" type="submit" alt="Upload" value="Upload" />
</form>
PHP создает это $_FILES
, когда представленный без JavaScript:
Array
(
[media] => Array
(
[name] => Array
(
[0] => Galata_Tower.jpg
[1] => 518f.jpg
)
[type] => Array
(
[0] => image/jpeg
[1] => image/jpeg
)
[tmp_name] => Array
(
[0] => /tmp/phpIQaOYo
[1] => /tmp/phpJQaOYo
)
[error] => Array
(
[0] => 0
[1] => 0
)
[size] => Array
(
[0] => 258004
[1] => 127884
)
)
)
Если вы делаете прогрессивное повышение, используя JS Raphael для отправки файлов ...
var data = new FormData($('input[name^="media"]'));
jQuery.each($('input[name^="media"]')[0].files, function(i, file) {
data.append(i, file);
});
$.ajax({
type: ppiFormMethod,
data: data,
url: ppiFormActionURL,
cache: false,
contentType: false,
processData: false,
success: function(data){
alert(data);
}
});
... это то, что PHP $_FILES
массив выглядит, после использования этого JavaScript для отправки:
Array
(
[0] => Array
(
[name] => Galata_Tower.jpg
[type] => image/jpeg
[tmp_name] => /tmp/phpAQaOYo
[error] => 0
[size] => 258004
)
[1] => Array
(
[name] => 518f.jpg
[type] => image/jpeg
[tmp_name] => /tmp/phpBQaOYo
[error] => 0
[size] => 127884
)
)
Это хороший массив, и на самом деле некоторые люди трансформируют $_FILES
в, но я считаю полезным работать с тем же $_FILES
, независимо от того, был ли JavaScript использован для отправки. Итак, вот некоторые незначительные изменения в JS:
// match anything not a [ or ]
regexp = /^[^[\]]+/;
var fileInput = $('.putImages input[type="file"]');
var fileInputName = regexp.exec( fileInput.attr('name') );
// make files available
var data = new FormData();
jQuery.each($(fileInput)[0].files, function(i, file) {
data.append(fileInputName+'['+i+']', file);
});
(14 апреля 2017 г. edit: я удалил элемент формы из конструктора FormData (), который исправил этот код в Safari.)
Этот код выполняет две функции.
input
, что делает HTML более удобным. Теперь, пока form
имеет класс putImages, все остальное заботится автоматически. То есть, у input
не должно быть специального имени. С этими изменениями, отправляя с помощью JavaScript, теперь создается точно такой же массив $_FILES
, что отправляется с простым HTML.