Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [AJAX]Formularz przesyłany ajaxem input + file
Forum PHP.pl > Forum > Przedszkole
casperii
Proszę o sprawdzenie poniższego kodu, niestety dane mi przesyła GETem chociaż mam ustawione POST, no i nie pobiera wartości z input file.

JS:
  1. (function() {
  2.  
  3. "use strict";
  4.  
  5. var saveForm = {
  6.  
  7. initialized: false,
  8.  
  9. initialize: function() {
  10.  
  11. if (this.initialized) return;
  12. this.initialized = true;
  13.  
  14. this.build();
  15. this.events();
  16.  
  17. },
  18.  
  19. build: function() {
  20.  
  21. this.validations();
  22.  
  23. },
  24.  
  25. events: function() {
  26.  
  27.  
  28.  
  29. },
  30.  
  31. validations: function() {
  32.  
  33. var saveform = $("#meform"),
  34. url = saveform.attr("action");
  35.  
  36. saveform.validate({
  37. submitHandler: function(form) {
  38. $.ajax({
  39. type: "POST",
  40. url: url,
  41. data: {
  42. "nickname": $("#meform #nickname").val(),
  43. "mefile": new FormData($("#meform #mefile").val())
  44. },
  45. cache: false,
  46. contentType: false,
  47. processData: false,
  48. });
  49. }
  50. });
  51.  
  52. }
  53.  
  54. };
  55.  
  56. saveForm.initialize();
  57.  
  58. })();


PHP:
  1. print_r($_FILES);
  2. echo '<br>';
  3. echo 'GET: ' . $_GET['nickname']; // pokazuje GET
  4. echo 'POST: ' . $_POST['nickname']; // nie pokazuje tutaj POST


ktoś rzuci okiem i napiszę gdzie robię błąd?
nospor
A skad pomysl ze metode wysylania POST/GET okresla sie parametrem TYPE??

https://api.jquery.com/jquery.ajax/
I sobie zobacz czym okresla sie metode. po co zgadaywac?
trueblue
Według manuala type jest tym samym co method:
Cytat
An alias for method. You should use type if you're using versions of jQuery prior to 1.9.0.
nospor
Nie mnie jednak nie dziala wiec moze jedna warto uzyc dedykowanego parametru a nie aliasu. Z aliasami jest ten problem ze z czasem znikaja
trueblue
Wydaje mi się, że dokumentacja jQuery jest prowadzona dosyć starannie.
Problemem jest raczej wartość processData ustawiona na false, co oznacza, że obiekt z data nie jest parsowany na query string (musimy to robić sami).
mortus
Po pierwsze formularz musi mieć ustawiony prawidłowy enctype i musi być odpowiednio zakodowany, abyśmy mogli użyć WebAPI FormData().
  1. <div id="results"></div>
  2. <div>
  3. <form action="action.php" method="POST" enctype="multipart/form-data" id="meform">
  4. <input type="text" name="nickname">
  5. <input type="file" name="mefile" />
  6. <input type="submit" value="Submit">
  7. </form>
  8. </div>

Po drugie jeżeli już używamy FormData() to nieco inaczej, bo na przykład tak jak poniżej.
[JAVASCRIPT] pobierz, plaintext
  1. validations: function () {
  2. var saveform = $("#meform"), url = saveform.attr("action");
  3. saveform.validate({
  4. submitHandler: function (form) {
  5. var formData = new FormData(form);
  6. $.ajax({
  7. type: "POST",
  8. url: url,
  9. data: formData,
  10. cache: false,
  11. contentType: false,
  12. processData: false
  13. })
  14. .done(function(data) {
  15. $('#results').html(data);
  16. });
  17. }
  18. });
  19. }
[JAVASCRIPT] pobierz, plaintext

Po trzecie dane wysyła GET-em, bo pewnie metody nie masz ustawionej w formularzu prawidłowej albo nie masz ustawionej w ogóle. Niemniej o wiele bardziej istotny jest fakt, że pewnie ten cały skrypt w javascript wrzucasz między <head> a </head>, a powinieneś wrzucić przed </body>.
trueblue
Atrybut enctype formularza nie ma znaczenia dla FormData.
Formularz może mieć dowolny typ przesyłania danych - i tak w żądaniu Ajax ustawiamy własny.
mortus
Cytat(trueblue @ 14.03.2023, 18:21:07 ) *
Atrybut enctype formularza nie ma znaczenia dla FormData.
Formularz może mieć dowolny typ przesyłania danych - i tak w żądaniu Ajax ustawiamy własny.


Po co takie komentarze, które nic nie wnoszą. enctype ma znaczenie, jeżeli chcemy wysyłać pliki. A jeżeli korzystamy z WebApi to konstruktor FormData() odczytuje dane z atrybutów name="" (key) i zatwierdzonych wartości (value).
trueblue
Dla Ciebie na pewno nic wniósł skoro go nie zrozumiałeś.
mortus
Cytat(trueblue @ 15.03.2023, 08:38:12 ) *
Dla Ciebie na pewno nic wniósł skoro go nie zrozumiałeś.


Czytanie ze zrozumieniem nie jest raczej Twoją mocną stroną.

Nie pisałem nigdzie, że typu danych nie możemy ustawić w żądaniu AJAX a jedynie, że typ multiform/form-data jest niezbędny do wysyłania plików. Z kolei pisałem, że formularz musi być odpowiednio zakodowany (każde pole formularza musi mieć atrybut name, a id nie jest istotne), abyśmy mogli korzystać z WebAPI FormData(). Nigdzie nie było sformułowania, które stwierdzało współzależność enctype i FormData.
trueblue
Cytat(mortus @ 15.03.2023, 09:06:20 ) *
Nie pisałem nigdzie, że typu danych nie możemy ustawić w żądaniu AJAX a jedynie, że typ multiform/form-data jest niezbędny do wysyłania plików.

Napisałeś:
Cytat(mortus)
Po trzecie dane wysyła GET-em, bo pewnie metody nie masz ustawionej w formularzu prawidłowej albo nie masz ustawionej w ogóle.

i do tego się odnosiłem, bo skoro dane są wysyłane Ajaxem przez POST, to metoda w formularzu nie ma znaczenia.

Odniosłem się również do tego, że multipart/form-data nie jest potrzebny przy używaniu FormData, a tak można rozumieć Twoje stwierdzenie, zgodnie z zasadami języka polskiego:
Cytat(mortus)
Po pierwsze formularz musi mieć ustawiony prawidłowy enctype i musi być odpowiednio zakodowany, abyśmy mogli użyć WebAPI FormData()[/b].


Wydaje mi się, że forum jest od tego, aby dyskutować, wyrażać swoje opinie, pomysły, dawać wskazówki, korygować, itd.

mortus
To takie sranie w banie... Piszesz, że odnosisz się do ostatniego zdania z mojej odpowiedzi, a słowem o tym wcześniej nie wspomniałeś. Bo mylisz typ przesyłania danych z metodą przesyłania.

Z kolei, jeżeli zrozumiałeś pierwsze zdanie w sposób, w jaki zrozumiałeś, to chyba tutaj trzeba było coś dopowiedzieć (poprawić). Może powinno to wyglądać w ten sposób:

"Po pierwsze formularz musi mieć ustawiony prawidłowy enctype. Musi też być odpowiednio zakodowany, abyśmy mogli użyć WebAPI FormData()."

I tyle. A Ty po prostu przekręcasz sformułowania.

Koledze wysyła dane w $_GET, bo nie ma metody w formularzu ustawionej na POST albo nie ma w ogóle, a jego skrypt się nie wykonuje i następuje przekierowanie na stronę akcji. Ty wyciągasz zdanie z kontekstu wypowiedzi i pomijasz o wiele bardziej istotny ... fakt.

Szukasz dziury w całym. A tak na prawdę, to formularz powinien zadziałać prawidłowo nawet wtedy, gdy AJAX nie zadziała, a co za tym idzie musi mieć zarówno ustawiony prawidłowy enctype, jak i odpowiednią method. Taka prawda ><

trueblue
Ok, Szeryfie, więcej nie będę "bruździł" w Twoim temacie.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.