• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Formdata generuje niepoprawny JSON

Object Storage Arubacloud
+1 głos
261 wizyt
pytanie zadane 1 maja 2019 w JavaScript przez `Krzychuu Stary wyjadacz (13,940 p.)
edycja 1 maja 2019 przez `Krzychuu

Witam,

w react mam state:

ingredients: [
                {
                    name: '1',
                    value: '1',
                    unit: '1'',
                },
            ],

razem z tym state chce wysłać zdjęcia, używam do tego FormData, zdjęcia przechodzą ale wartość ze state już nie, mam zrobione tak:

let formData = new FormData();
        let values = this.state.values;

       for (let key = 0; key < Object.keys(values.photos).length; key++) {
          formData.append("images[]", values.photos[key]);
       }

        for (let key = 0; key < Object.keys(values.ingredients).length; key++) {
            formData.append("ingredients[]", values.ingredients[key]);
        }

        await recipeApi.createRecipe(formData)
            .then(response => {
                this.setState({snackbar: {
                        open: true,
                        message: response.data.success,
                        variant: 'success',
                    }
                });
                this.setState({activeStep: 0});

                this.props.history.push(`/recipe/${response.data.slug}`);
            })
            .catch(error => {
                this.setState({snackbar: {
                        open: true,
                        message: error.response.data.error,
                        variant: 'error',
                    }
                });

                console.log(error.response.data);
            })

gdy wyśle tak to wyskakuje że wartość w ingredients jest błędna, próbowałem zrobić też tak ale ciągle tak samo:

        for (let key = 0; key < Object.keys(values.ingredients).length; key++) {
            formData.append("ingredients[]", JSON.stringify(values.ingredients[key]));
        }

gdy patrze co wraca z backendu to bez JSON.stringify wyrzuca 

ingredients: Array(1)
0: "[object Object]"

a z JSON.stringify:

ingredients: Array(1)
0: "{"name":"1","value":"1","unit":"kg"}"

próbowałem też zrobić recipeApi.createRecipe(JSON.stringify(formData)) ale wtedy nie przechodzą obrazki :/

 

PS: ogólnie inne wartości przechodzą dalej tylko mam problem z tablicą ingredients, wartości przechodzą bez użycia JSON.stringify 

1
komentarz 1 maja 2019 przez ScriptyChris Mędrzec (190,190 p.)

Czy możesz pokazać strukturę danych dla obrazków, czyli values.photos?

komentarz 1 maja 2019 przez `Krzychuu Stary wyjadacz (13,940 p.)
FileList {0: File, length: 1}
0: File {name: "cat.jpg", lastModified: 1553511094320, lastModifiedDate: Mon Mar 25 2019 11:51:34 GMT+0100 (czas środkowoeuropejski standardowy), webkitRelativePath: "", size: 435693, …}
length: 1

state:

photos: {}

 

komentarz 1 maja 2019 przez `Krzychuu Stary wyjadacz (13,940 p.)

@JSHolic, PS: jednak jak dam JSON.stringify(formData) to w ogóle nic nie przechodzi :/

komentarz 1 maja 2019 przez ScriptyChris Mędrzec (190,190 p.)

Obstawiam, że problem jest w błędnej formie dodawania danych do formData, Dane powinny być enkodowane jako "multipart/form-data", czyli - klucz/wartość (tak jak ma to miejsce przy przesyłaniu zwykłego formularza). Ty natomiast wrzucasz tam obiekty. Spróbuj sklejać je w taki sposób:

// PSEUDOKOD

for (..) {
	formData.append('ingredients.name', '1');
	.. // następna iteracja
	formData.append('ingredients.value', '1');
}

Czyli zagnieżdżenia zapisuj jako

formData.append( "ingredients[ ewentualny_indeks_obiektu_w_tablicy ].nazwa_klucza_obiektu", "wartość" );

. Możesz sobie to zautomatyzować (jakaś funkcja rekurencyjna do sklejania tego). Ewentualnie zrezygnuj z FormData i prześlij jako JSON.

komentarz 1 maja 2019 przez `Krzychuu Stary wyjadacz (13,940 p.)
problem w tym że przez json nie przesyła mi obrazku tylko null :/
komentarz 1 maja 2019 przez ScriptyChris Mędrzec (190,190 p.)
To prześlij w formacie binarnym lub jako Base64.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 273 wizyt
pytanie zadane 29 stycznia 2023 w JavaScript przez Beginner555 Obywatel (1,760 p.)
0 głosów
1 odpowiedź 609 wizyt
0 głosów
2 odpowiedzi 130 wizyt
pytanie zadane 14 marca 2018 w JavaScript przez ajzyn Użytkownik (510 p.)

92,551 zapytań

141,395 odpowiedzi

319,526 komentarzy

61,936 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...