Send FormData and String Data Together Through JQuery AJAX?
如何使用
html,
1 2 3 4 5 6 7 | <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,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | // 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
1 2 | print_r($_FILES); print_r($_POST); |
结果,
1 2 3 4 5 6 7 8 9 10 11 12 | Array ( [file] => Array ( [name] => xxx.doc [type] => application/msword [tmp_name] => C:\\wamp\\tmp\\php7C24.tmp [error] => 0 [size] => 11776 ) ) |
我希望得到这个结果,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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 ... ) |
可能吗?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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); } }); |
添加了
好吧,作为一种更简单,更短的方法,您也可以这样做!!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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); } }); |
我经常使用它,它使用ajax发送表单数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | $(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) { } }); }); |
我尝试与朋友一起进行代码协作。来自此论坛的修改。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | $('#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文件
1 2 3 | <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代码文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <?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] . ''; } else { $i = 0; for ($i = 0; $i < $count; $i++) { move_uploaded_file($_FILES['arr']['tmp_name'][$i], 'uploads/' . $_FILES['arr']['name'][$i]); } } ?> |
我希望有同样问题的人,能够快速解决这个问题。
我很头疼,因为有多个上传图片。
据我了解,您希望将图像和输入值一起发送。该代码对我来说效果很好,希望对以后的人有所帮助。
1 2 3 4 5 6 7 | <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> |
--
1 2 3 4 5 6 7 8 9 10 | 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多次上传的简短代码。
https://santanamic.github.io/ajax-multiple-upload/
您可以尝试以下方法:
1 2 3 4 5 6 7 8 9 | 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 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | var fd = new FormData(); //Get Form Values var other_data = $('#form1').serializeArray(); $.each(other_data, function (key, input) { fd.append(input.name, input.value); }); //Get File Value var $file = jq("#photoUpload").get(0); if ($file.files.length > 0) { for (var i = 0; i < $file.files.length; i++) { fd.append('Photograph' + i, $file.files[i]); } } $.ajax({ url: 'test.php', data: fd, contentType: false, processData: false, type: 'POST', success: function(data){ console.log(data); } }); |
对于ajax中的多个文件,请尝试以下操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | var url ="your_url"; var data = $('#form').serialize(); var form_data = new FormData(); //get the length of file inputs var length = $('input[type="file"]').length; for(var i = 0;i<length;i++){ file_data = $('input[type="file"]')[i].files; form_data.append("file_"+i, file_data[0]); } // for other data form_data.append("data",data); $.ajax({ url: url, type:"POST", data: form_data, cache: false, contentType: false, //important processData: false, //important success: function (data) { //do something } }) |
在PHP中
1 2 3 4 5 6 7 8 9 10 | parse_str($_POST['data'], $_POST); for($i=0;$i<count($_FILES);$i++){ if(isset($_FILES['file_'.$i])){ $file = $_FILES['file_'.$i]; $file_name = $file['name']; $file_type = $file ['type']; $file_size = $file ['size']; $file_path = $file ['tmp_name']; } } |
我发现,如果以某种方式(例如您的ModelState在服务器上为false)并将页面再次发布到服务器,则它将旧值带给服务器。因此,我为此找到了解决方案。
1 2 3 4 5 6 7 8 | var data = new FormData(); $.each($form.serializeArray(), function (key, input) { if (data.has(input.name)) { data.set(input.name, input.value); } else { data.append(input.name, input.value); } }); |
对于多文件输入:
试试这个代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | <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); } }); }); |