Używam jQuery i Ajax do formularzy do przesyłania danych i plików, ale nie jestem pewien, jak wysłać zarówno dane, jak i pliki w jednym formularzu?
Obecnie robię prawie to samo z obiema metodami, ale sposób, w jaki dane są gromadzone w tablicy, jest inny, dane używają, .serialize();
ale pliki używają= new FormData($(this)[0]);
Czy można połączyć obie metody, aby móc przesyłać pliki i dane w jednej formie za pośrednictwem Ajax?
Dane jQuery, Ajax i HTML
$("form#data").submit(function(){
var formData = $(this).serialize();
$.ajax({
url: window.location.pathname,
type: 'POST',
data: formData,
async: false,
success: function (data) {
alert(data)
},
cache: false,
contentType: false,
processData: false
});
return false;
});
<form id="data" method="post">
<input type="text" name="first" value="Bob" />
<input type="text" name="middle" value="James" />
<input type="text" name="last" value="Smith" />
<button>Submit</button>
</form>
Pliki jQuery, Ajax i HTML
$("form#files").submit(function(){
var formData = new FormData($(this)[0]);
$.ajax({
url: window.location.pathname,
type: 'POST',
data: formData,
async: false,
success: function (data) {
alert(data)
},
cache: false,
contentType: false,
processData: false
});
return false;
});
<form id="files" method="post" enctype="multipart/form-data">
<input name="image" type="file" />
<button>Submit</button>
</form>
Jak połączyć powyższe, aby móc wysyłać dane i pliki w jednej formie za pośrednictwem Ajax?
Moim celem jest, aby móc wysłać cały ten formularz w jednym poście z Ajax, czy to możliwe?
<form id="datafiles" method="post" enctype="multipart/form-data">
<input type="text" name="first" value="Bob" />
<input type="text" name="middle" value="James" />
<input type="text" name="last" value="Smith" />
<input name="image" type="file" />
<button>Submit</button>
</form>
javascript
jquery
ajax
forms
Dan
źródło
źródło
FormData
Podejście powinno działać dobrze z form, które zawierają co chcesz, nie tylko pola Prześlij plik; nie jest to jednak powszechnie obsługiwane.FormData
Odpowiedzi:
Problem, który miałem, to użycie niewłaściwego identyfikatora jQuery.
Możesz przesyłać dane i pliki w jednym formularzu za pomocą ajax .
PHP + HTML
jQuery + Ajax
Krótka wersja
źródło
$(this)[0]
jest tylko aliasemthis
, więcnew FormData(this)
powinno wystarczyć.async: false
wydaje się, że nie jest to wymagane do działania i powoduje blokowanie w mobilnych przeglądarkach (jednowątkowych)inną opcją jest użycie elementu iframe i ustawienie dla niego celu formularza.
możesz spróbować tego (używa jQuery):
działa dobrze ze wszystkimi przeglądarkami, nie trzeba serializować ani przygotowywać danych. jedną wadą jest to, że nie można monitorować postępów.
także, przynajmniej w przypadku Chrome, żądanie nie pojawi się na karcie „xhr” narzędzi programistycznych, ale w „doc”
źródło
Miałem ten sam problem w ASP.Net MVC z HttpPostedFilebase i zamiast używać formularza w Prześlij, musiałem użyć przycisku po kliknięciu w miejscu, w którym musiałem zrobić kilka rzeczy, a następnie, jeśli wszystko w porządku, prześlij formularz, więc oto jak to działa
spowoduje to prawidłowe wypełnienie modelu MVC, upewnij się, że w modelu właściwość HttpPostedFileBase [] ma taką samą nazwę jak nazwa kontrolki wejściowej w html, tj.
źródło
contentType : "application/octet-stream"
Lub krócej:
źródło
Dla mnie nie działało bez
enctype: 'multipart/form-data'
pola w żądaniu Ajax. Mam nadzieję, że pomoże to komuś, kto tkwi w podobnym problemie.Chociaż z jakiegoś powodu
enctype
zostało już ustawione w atrybucie formularza , żądanie Ajax nie zidentyfikowało automatycznieenctype
bez wyraźnej deklaracji (jQuery 3.3.1).Jak wspomniano powyżej, należy również zwrócić szczególną uwagę na pola
contentType
iprocessData
.źródło
enctype
w ogóle nie wspomniano.enctype
z jakiegoś powodu pole nie jest uwzględnione w dokumentacji. Nie sprawdziłem kodu źródłowego jQuery, więc nie mogę powiedzieć z całą pewnością.enctype
pole i nie przesyła on już plików (zwraca błąd typu kodowania). Nie jestem pewien, jak to działa, ponieważ nie sprawdziłem kodu źródłowego jQuery. Zamieściłem tę odpowiedź z zamiarem pomocy innym, którzy tkwią w podobnym problemie. Nie szukam tutaj głosów pozytywnych ... Jeśli masz dodatkowe pytania / komentarze, porozmawiajmy zamiast komentować.Dla mnie następujący kod działa
W metodzie Action Post przekaż parametr jako HttpPostedFileBase UploadFile i upewnij się, że dane wejściowe pliku są takie same, jak wymienione w parametrze metody akcji. Powinien również współpracować z formularzem AJAX Begin.
Pamiętaj tutaj, że Twój formularz AJAX BEGIN nie będzie tutaj działał, ponieważ wykonujesz połączenie pocztowe zdefiniowane w powyższym kodzie i możesz odwoływać się do metody w kodzie zgodnie z wymaganiami
Wiem, że odpowiadam późno, ale to zadziałało dla mnie
źródło
Prosty, ale bardziej skuteczny sposób:
new FormData()
sam w sobie jest jak pojemnik (lub torba). Możesz umieścić wszystko attr lub plik w sobie. Jedyne, czego potrzebujesz, to dołączyćattribute, file, fileName
np .:i po prostu przekaż go w żądaniu AJAX. Na przykład:
Możesz dodać n liczby plików lub danych za pomocą FormData.
a jeśli tworzysz żądanie AJAX z pliku Script.js do pliku trasy w Node.js, strzeż się korzystania
req.body
z dostępu do danych (tj. tekstu) wreq.files
celu uzyskania dostępu do pliku (np. obrazu, wideo itp.)źródło
W moim przypadku musiałem złożyć żądanie POST, które zawierało informacje przesłane przez nagłówek, a także plik wysłany przy użyciu obiektu FormData.
Sprawiłem, że działało, używając kombinacji kilku odpowiedzi tutaj, więc w zasadzie to, co skończyło się działaniem, zawierało pięć wierszy w moim żądaniu Ajax:
Gdzie formData była zmienną utworzoną w ten sposób:
źródło
contentType: "application/octet-stream",
jest aktywnie szkodliwy, a jedynym powodem, dla którego nie powoduje problemu, jest nadpisanie go dwie linie później.enctype: 'multipart/form-data',
jest bezcelowe. jQuery.ajax nie rozpoznaje tego parametru.///// otherpage.php
źródło