Как отправить файл и ввести данные строки с помощью FormData()
? Например, у меня есть много других скрытых входных данных, которые мне нужны для отправки на сервер,
HTML,
<form action="image.php" method="post" enctype="multipart/form-data"> <input type="file" name="file[]" multiple="" /> <input type="hidden" name="page_id" value="<?php echo $page_id;?>"/> <input type="hidden" name="category_id" value="<?php echo $item_category->category_id;?>"/> <input type="hidden" name="method" value="upload"/> <input type="hidden" name="required[category_id]" value="Category ID"/> </form>
С помощью этого кода ниже я могу только отправлять данные файла, но не скрытые входные данные.
JQuery,
// HTML5 form data object. var fd = new FormData(); var file_data = object.get(0).files[i]; var other_data = $('form').serialize(); // page_id=&category_id=15&method=upload&required%5Bcategory_id%5D=Category+ID fd.append("file", file_data); $.ajax({ url: 'add.php', data: fd, contentType: false, processData: false, type: 'POST', success: function(data){ alert(data); } });
server.php
print_r($_FILES); print_r($_POST);
результат,
Array ( [file] => Array ( [name] => xxx.doc [type] => application/msword [tmp_name] => C:\wamp\tmp\php7C24.tmp [error] => 0 [size] => 11776 ) )
Я хотел бы получить это как мой результат, хотя,
Array ( [file] => Array ( [name] => xxx.doc [type] => application/msword [tmp_name] => C:\wamp\tmp\php7C24.tmp [error] => 0 [size] => 11776 ) ) Array ( [page_id] => 1000 [category_id] => 12 [method] => upload ... )
Является ли это возможным?
var fd = new FormData(); var file_data = $('input[type="file"]')[0].files; // for multiple files for(var i = 0;i<file_data.length;i++){ fd.append("file_"+i, file_data[i]); } var other_data = $('form').serializeArray(); $.each(other_data,function(key,input){ fd.append(input.name,input.value); }); $.ajax({ url: 'test.php', data: fd, contentType: false, processData: false, type: 'POST', success: function(data){ console.log(data); } });
Добавлен цикл for
и изменился .serialize()
на .serializeArray()
для ссылки на объект в .each()
для добавления в FormData
.
ну, как более простая альтернатива и короче, вы тоже можете это сделать!
var fd = new FormData(); var file_data = object.get(0).files[i]; var other_data = $('form').serialize(); //page_id=&category_id=15&method=upload&required%5Bcategory_id%5D=Category+ID fd.append("file", file_data); $.ajax({ url: 'add.php?'+ other_data, //<== just add it to the end of url *** data: fd, contentType: false, processData: false, type: 'POST', success: function(data){ alert(data); } });
-var fd = new FormData(); var file_data = object.get(0).files[i]; var other_data = $('form').serialize(); //page_id=&category_id=15&method=upload&required%5Bcategory_id%5D=Category+ID fd.append("file", file_data); $.ajax({ url: 'add.php?'+ other_data, //<== just add it to the end of url *** data: fd, contentType: false, processData: false, type: 'POST', success: function(data){ alert(data); } });
Я всегда использую this.It отправить данные формы с помощью ajax
$(document).on("submit", "form", function(event) { event.preventDefault(); var url=$(this).attr("action"); $.ajax({ url: url, type: 'POST', data: new FormData(this), processData: false, contentType: false, success: function (data, status) { } }); });
Я пытаюсь внести свой вклад в сотрудничество с моим другом. с этого форума.
$('#upload').on('click', function() { var fd = new FormData(); var c=0; var file_data,arr; $('input[type="file"]').each(function(){ file_data = $('input[type="file"]')[c].files; // get multiple files from input file console.log(file_data); for(var i = 0;i<file_data.length;i++){ fd.append('arr[]', file_data[i]); // we can put more than 1 image file } c++; }); $.ajax({ url: 'test.php', data: fd, contentType: false, processData: false, type: 'POST', success: function(data){ console.log(data); } }); });
этот мой html-файл
<form name="form" id="form" method="post" enctype="multipart/form-data"> <input type="file" name="file[]"multiple> <input type="button" name="submit" value="upload" id="upload">
этот файл php-кода
<?php $count = count($_FILES['arr']['name']); // arr from fd.append('arr[]') var_dump($count); echo $count; var_dump($_FILES['arr']); if ( $count == 0 ) { echo 'Error: ' . $_FILES['arr']['error'][0] . '<br>'; } else { $i = 0; for ($i = 0; $i < $count; $i++) { move_uploaded_file($_FILES['arr']['tmp_name'][$i], 'uploads/' . $_FILES['arr']['name'][$i]); } } ?>
Я надеюсь, что люди с одинаковой проблемой могут быстро решить эту проблему. у меня головная боль, потому что многократно загружают изображение.
Вы можете попробовать следующее:
var fd = new FormData(); var data = []; //<---------------declare array here var file_data = object.get(0).files[i]; var other_data = $('form').serialize(); data.push(file_data); //<----------------push the data here data.push(other_data); //<----------------and this data too fd.append("file", data); //<---------then append this data
Насколько я понимаю, вы хотели бы отправить изображения и значения входов вместе. Этот код хорошо работает для меня, я надеюсь, что это поможет кому-то в будущем.
<form id="my-form" method="post" enctype="multipart/form-data"> <input type="file" name="file[]" multiple="" /> <input type="hidden" name="page_id" value="<?php echo $page_id;?>"/> <input type="hidden" name="category_id" value="<?php echo $item_category->category_id;?>"/> <input type="hidden" name="method" value="upload"/> <input type="hidden" name="required[category_id]" value="Category ID"/> </form>
–
jQuery.ajax({ url: 'post.php', data: new FormData($('#my-form')[0]), cache: false, contentType: false, processData: false, type: 'POST', success: function(data){ console.log(data); }});
Взгляните на мой короткий код для многократной загрузки ajax с предварительным просмотром.
Для ввода нескольких файлов: попробуйте этот код:
<form name="form" id="form" method="post" enctype="multipart/form-data"> <input type="file" name="file[]"> <input type="file" name="file[]" > <input type="text" name="name" id="name"> <input type="text" name="name1" id="name1"> <input type="button" name="submit" value="upload" id="upload"> </form> $('#upload').on('click', function() { var fd = new FormData(); var c=0; var file_data; $('input[type="file"]').each(function(){ file_data = $('input[type="file"]')[c].files; // for multiple files for(var i = 0;i<file_data.length;i++){ fd.append("file_"+c, file_data[i]); } c++; }); var other_data = $('form').serializeArray(); $.each(other_data,function(key,input){ fd.append(input.name,input.value); }); $.ajax({ url: 'work.php', data: fd, contentType: false, processData: false, type: 'POST', success: function(data){ console.log(data); } }); });
Просто возьмите форму в jQuery, выполните итерацию по элементам и добавьте их в данные формы, с правильным типом курса.