Mam więc formularz i przesyłam go przez Ajax przy użyciu funkcji serializacji jQuery
serialized = $(Forms).serialize();
$.ajax({
type : "POST",
cache : false,
url : "blah",
data : serialized,
success: function(data) {
}
ale co wtedy, jeśli formularz ma <input type="file">
pole ... jak przekazać plik do formularza za pomocą tej metody serializacji ajax ... drukowanie $ _FILES nie wyświetla niczego
źródło
Użyj
FormData
obiektu Działa dla każdego typu formularza$(document).on("submit", "form", function(event) { event.preventDefault(); $.ajax({ url: $(this).attr("action"), type: $(this).attr("method"), dataType: "JSON", data: new FormData(this), processData: false, contentType: false, success: function (data, status) { }, error: function (xhr, desc, err) { } }); });
źródło
processData: false, contentType: false,
jest potrzebna, aby uniknąćIllegal invocation
błędu, ponieważ bez nich jQuery spróbuje przekonwertować dane formdata na ciąg podczas wysyłania, co nie jest pożądane w tym przypadku.var form = $('#job-request-form')[0]; var formData = new FormData(form); event.preventDefault(); $.ajax({ url: "/send_resume/", // the endpoint type: "POST", // http method processData: false, contentType: false, data: formData,
U mnie zadziałało! wystarczy ustawić processData i contentType False.
źródło
HTML
<form name="my_form" id="my_form" accept-charset="multipart/form-data" onsubmit="return false"> <input id="name" name="name" placeholder="Enter Name" type="text" value=""> <textarea id="detail" name="detail" placeholder="Enter Detail"></textarea> <select name="gender" id="gender"> <option value="male" selected="selected">Male</option> <option value="female">Female</option> </select> <input type="file" id="my_images" name="my_images" multiple="" accept="image/x-png,image/gif,image/jpeg"/> </form>
JavaScript
var data = new FormData(); //Form data var form_data = $('#my_form').serializeArray(); $.each(form_data, function (key, input) { data.append(input.name, input.value); }); //File data var file_data = $('input[name="my_images"]')[0].files; for (var i = 0; i < file_data.length; i++) { data.append("my_images[]", file_data[i]); } //Custom data data.append('key', 'value'); $.ajax({ url: "URL", method: "post", processData: false, contentType: false, data: data, success: function (data) { //success }, error: function (e) { //error } });
PHP
<?php echo '<pre>'; print_r($_POST); print_r($_FILES); echo '</pre>'; die(); ?>
źródło
<button type="button" name="button_name" value="Contact Button">Submit</button>
i otrzymasz odpowiedź button_name = "Przycisk kontaktu" po stronie phpformData.append("btnName", "true");
data.append('key', 'value');
Pliki można przesyłać za pośrednictwem technologii AJAX przy użyciu metody FormData. Chociaż IE7,8 i 9 nie obsługują funkcji FormData.
$.ajax({ url: "ajax.php", type: "POST", data: new FormData('form'), contentType: false, cache: false, processData:false, success: function(data) { $("#response").html(data); } });
źródło
$(document).on('click', '#submitBtn', function(e){ e.preventDefault(); e.stopImmediatePropagation(); var form = $("#myForm").closest("form"); var formData = new FormData(form[0]); $.ajax({ type: "POST", data: formData, dataType: "json", url: form.attr('action'), processData: false, contentType: false, success: function(data) { alert('Sucess! Form data posted with file type of input also!'); } )};});
Dzięki wykorzystaniu
new FormData()
i ustawieniuprocessData: false, contentType:false
w wywołaniu ajax przesłanie formularza z danymi wejściowymi do pliku zadziałało dla mnieKorzystając z powyższego kodu jestem w stanie przesłać dane formularza z polem pliku również przez Ajax
źródło
hmmmm, myślę, że istnieje dużo skuteczny sposób, aby zrobić to specjalnie dla ludzi, którzy chcą kierować reklamy na wszystkie przeglądarki, a nie tylko przeglądarki obsługujące FormData
pomysł, aby ukryć ramkę IFRAME na stronie i wykonać normalne przesyłanie dla przykładu From inside IFrame
<FORM action='save_upload.php' method=post enctype='multipart/form-data' target=hidden_upload> <DIV><input type=file name='upload_scn' class=file_upload></DIV> <INPUT type=submit name=submit value=Upload /> <IFRAME id=hidden_upload name=hidden_upload src='' onLoad='uploadDone("hidden_upload")' style='width:0;height:0;border:0px solid #fff'></IFRAME> </FORM>
Najważniejsze, aby celem formularza było ukryte ID iframe lub nazwa i zakodowanie multipart / form-data, aby umożliwić akceptowanie zdjęć
strona javascript
function getFrameByName(name) { for (var i = 0; i < frames.length; i++) if (frames[i].name == name) return frames[i]; return null; } function uploadDone(name) { var frame = getFrameByName(name); if (frame) { ret = frame.document.getElementsByTagName("body")[0].innerHTML; if (ret.length) { var json = JSON.parse(ret); // do what ever you want } } }
Przykład po stronie serwera PHP
<?php $target_filepath = "/tmp/" . basename($_FILES['upload_scn']['name']); if (move_uploaded_file($_FILES['upload_scn']['tmp_name'], $target_filepath)) { $result = .... } echo json_encode($result); ?>
źródło
HTML5 wprowadza
FormData
klasę, której można użyć do przesyłania plików za pomocą Ajax.Obsługa FormData rozpoczyna się od następujących wersji przeglądarek komputerowych. IE 10+, Firefox 4.0+, Chrome 7+, Safari 5+, Opera 12+
FormData - Mozilla.org
źródło