Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [AJAX]Formularz przesyłany ajaxem input + file
casperii
post
Post #1





Grupa: Zarejestrowani
Postów: 681
Pomógł: 28
Dołączył: 14.08.2014

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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?
Go to the top of the page
+Quote Post
trueblue
post
Post #3





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Nie mnie jednak nie dziala wiec moze jedna warto uzyc dedykowanego parametru a nie aliasu. Z aliasami jest ten problem ze z czasem znikaja
Go to the top of the page
+Quote Post
trueblue
post
Post #5





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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).
Go to the top of the page
+Quote Post
mortus
post
Post #6





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


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>.
Go to the top of the page
+Quote Post
trueblue
post
Post #7





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
mortus
post
Post #8





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


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).

Ten post edytował mortus 14.03.2023, 20:21:20
Go to the top of the page
+Quote Post
trueblue
post
Post #9





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Dla Ciebie na pewno nic wniósł skoro go nie zrozumiałeś.
Go to the top of the page
+Quote Post
mortus
post
Post #10





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
trueblue
post
Post #11





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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.

Go to the top of the page
+Quote Post
mortus
post
Post #12





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


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 ><



Ten post edytował mortus 15.03.2023, 10:00:35
Go to the top of the page
+Quote Post
trueblue
post
Post #13





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Ok, Szeryfie, więcej nie będę "bruździł" w Twoim temacie.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 26.08.2025 - 11:50