Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [AJAX]fetch AJAX wgrywanie obrazu
Forum PHP.pl > Forum > Przedszkole
casperii
Witam , wracam z kolejnym błędem (pozdrawiam @nospor Lkingsmiley.png )
Poniżej prezentuje kod , niestety męczę się z banalnym problem sad.gif
Problem polega na tym, że nie przesyła obrazka / nie odbiera w pliku .php
Sam plik php jest 100% prawidłowy , katalog na serwerze ma prawidłowe chmody , problem tkwi gdzieś w podaniu prawidłowej wartości do przesłania.
Na konsoli błąd:
Uncaught (in promise) SyntaxError: Unexpected end of JSON input i tyczy się tej linii return response.json();

index.html
  1. const upload_image = (file) => {
  2.  
  3. if(!['image/jpeg', 'image/png'].includes(file.type))
  4. {
  5. document.getElementById('uploaded_image').innerHTML = '<div class="alert alert-danger">Z tym plikiem to wiesz gdzie możesz</div>';
  6.  
  7. document.getElementsByName('sample_image')[0].value = '';
  8.  
  9. return;
  10. }
  11.  
  12. if(file.size > 2 * 1024 * 1024)
  13. {
  14. document.getElementById('uploaded_image').innerHTML = '<div class="alert alert-danger">Masz za dużego plika , max to 2mb</div>';
  15.  
  16. document.getElementsByName('sample_image')[0].value = '';
  17.  
  18. return;
  19. }
  20. }
  21.  
  22. const form = document.getElementById('custom-step-news');
  23. form.addEventListener('submit', function(e){
  24. e.preventDefault();
  25.  
  26. const test = form.test.value;
  27. const sample_image = document.getElementsByName('sample_image')[0];
  28.  
  29. upload_image(sample_image.files[0]);
  30.  
  31. const form_data = new FormData();
  32. const file = document.getElementsByName('sample_image')[0].value = '';
  33. form_data.append('sample_image', file);
  34.  
  35.  
  36. fetch('xxupload.php', {
  37. method:"POST",
  38. headers: {
  39. 'Content-Type': 'multipart/form-data',
  40. },
  41. body:form_data
  42.  
  43. }).then(function(response){
  44.  
  45. return response.json();
  46.  
  47. }).then(function(responseData){
  48.  
  49. document.getElementById('uploaded_image').innerHTML = '<div class="alert alert-success">poszło</div> <img src="'+responseData.image_source+'">';
  50.  
  51. document.getElementsByName('sample_image')[0].value = '';
  52.  
  53. });
  54.  
  55. });
trueblue
Przecież możesz sprawdzić w zakładce Network/Sieć jaką odpowiedź otrzymujesz od skryptu PHP.
nospor
Podejrzyj w konsoli przegladarki co konkretnie dostajesz i bedziesz widzial blad
casperii
Napisałem @nospor co w konsoli pojawia się:
Na konsoli błąd:
Uncaught (in promise) SyntaxError: Unexpected end of JSON input i tyczy się tej linii return response.json();

@trueblue zakładka "Sieć" nic nie pokazuje, wydaje mi się, że nie dochodzi do odpalenia pliku, poprzez błędną składnie.
trueblue
Sprawdź dobrze czy nie masz założonych filtrów na konkretne typy żądań lub nazwę pliku (we wspomnianej zakładce).
casperii
@trueblue nie mam założonych filtrów. Dziwne, jak zmienie zamiast :

  1. form.addEventListener('submit', function(e){


usunę form i bezpośrednio zrobię onchange na dany input type file to plik się wgrywa na serwer.
trueblue
Jeśli błąd wywoływany jest w linii, którą wskazujesz, oznacza to, że następuje przekazanie żądania do serwera i zwrotka. Czyli musi być w zakładce Network.

Co robi ta linia?
  1. const file = document.getElementsByName('sample_image')[0].value = '';
nospor
Cytat
Napisałem @nospor co w konsoli pojawia się:

Mialem na mysli network rzecz jasna... Najwyraznie uzylem zbyt duzego skrotu myslowego wink.gif
casperii
ok, problem rozwiązany, ale jeszcze chciałbym dopytać co robię źle z poniższym kodem:

  1. form.addEventListener('submit', function(e){
  2. const test = document.getElementById("test").value;
  3. alert(test);
  4. console.log(test);


konsola jak i alert podaje wartość którą wpisałem w input. Natomiast json zwraca mi komunikat:
[object HTMLInputElement]

natomiast jeżeli na sztywno wpiszę w JS

  1. form_data.append('test', 'jakiś test');


zamiast

  1. form_data.append('test', test);


to json zwraca poprawnie treść. I teraz nie wiem czy coś źle przekazuje ajaxem, czy źle odbieram dane


aha , dane odbieram tak:

  1. .then(function(responseData){
  2.  
  3. document.getElementById('komunikat').innerHTML = '<div class="alert alert-success">ok ' +responseData.test+'</div> <img src="'+responseData.image_source+'">';
  4.  
  5. });


o ile responseData.image_source zwraca poprawnie , tak responseData.test zwraca poprawnie jeżeli na sztywno przekaże treść w append.
trueblue
Podaj większy fragment kodu gdzie tworzysz JSON.
casperii
@trueblue

  1. const form_data = new FormData();
  2.  
  3. form_data.append('sample_image', file);
  4. form_data.append('test', test);
  5.  
  6. fetch("upload.php", {
  7.  
  8. method:"POST",
  9.  
  10. body:form_data
  11.  
  12. }).then(function(response){
  13.  
  14. return response.json();
  15.  
  16. }).then(function(responseData){
  17.  
  18. document.getElementById('komunikat').innerHTML = 'test: ' +responseData.test+'img: '+responseData.image_source+' ';
  19.  
  20. });
trueblue
A zmienna test?
casperii
Cytat(trueblue @ 19.07.2022, 09:18:38 ) *
A zmienna test?



JS:
  1.  
  2. const test = document.getElementsByName("test").value // nie działa
  3. const test = document.getElementsById("test").value // też nie działa
  4. form_data.append('test', test); // nie działa
  5. form_data.append('test', "coś wpisane"); działa


po stronie PHP:
  1. $test = $_POST['test']; // przekazana na sztywno wartość działa
  2. $data = array(
  3. 'image_source' => '/upload' . $new_name,
  4. 'test' => $test
  5. );
  6.  
  7. echo json_encode($data);
  8.  
trueblue
Co to znaczy, że 3 linie dają wynik "nie działa"? Co zwracają? Czy na stronie jest jeden element o id=test?
viking
document.getElementsById("test").value nie ma takiej metody w js.z dokumentacji mdn formData.append("userfile", fileInputElement.files[0]);
casperii
Cytat(trueblue @ 19.07.2022, 16:04:41 ) *
Co to znaczy, że 3 linie dają wynik "nie działa"? Co zwracają? Czy na stronie jest jeden element o id=test?



nie działa = przekazuje [object HTMLInputElement]
tak mam input z takim ID i jest tylko 1

[html][/html]


@viking, czyli , że co jak robię fetchem upload to nie mogę wstawić dodatkowego pola input / textarea ?
viking
Możesz. Ale gdzie to przekazujesz do FormData? Masz jedno wywołanie przez jakąś funkcję.
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.