it-swarm.com.de

Kann ich in Javascript ein Array an 'formdata' anhängen?

Ich verwende FormData zum Hochladen von Dateien. Ich möchte auch eine Reihe anderer Daten senden.

Wenn ich nur das Bild sende, funktioniert es einwandfrei. Wenn ich Text an die Formulardaten anhänge, funktioniert das einwandfrei. Wenn ich versuche, das "Tags" -Array unten anzuhängen, funktioniert alles andere, aber es wird kein Array gesendet.

Bekannte Probleme mit FormData und angehängten Arrays?

Instanziiere formData:

formdata = new FormData();

Das Array, das ich erstelle. Console.log zeigt, dass alles gut funktioniert.

        // Get the tags
        tags = new Array();
        $('.tag-form').each(function(i){
            article = $(this).find('input[name="article"]').val();
            gender = $(this).find('input[name="gender"]').val();
            brand = $(this).find('input[name="brand"]').val();
            this_tag = new Array();
            this_tag.article = article;
            this_tag.gender = gender;
            this_tag.brand = brand;
            tags.Push(this_tag);    
            console.log('This is tags array: ');
            console.log(tags);
        });
        formdata.append('tags', tags);
        console.log('This is formdata: ');
        console.log(formdata);

So sende ich es:

        // Send to server
        $.ajax({
            url: "../../build/ajaxes/upload-photo.php",
            type: "POST",
            data: formdata,
            processData: false,
            contentType: false,
            success: function (response) {
                console.log(response);
                $.fancybox.close();
            }
        });
16
Don P

Wie wäre es damit?

formdata.append('tags', JSON.stringify(tags));

... und entsprechend json_decode auf dem Server verwenden, um sie zu trennen. Der zweite Wert von FormData.append kann Folgendes sein:.

ein Blob, eine Datei oder eine Zeichenfolge, falls nicht, wird der Wert in eine .__-Datei konvertiert. Schnur

So wie ich es sehe, enthält Ihr tags-Array Objekte (@Musa ist richtig, übrigens; this_tag wird zu einem Array, und die Zuweisung von String-Eigenschaften ist dann sinnlos; verwenden Sie stattdessen ein einfaches Objekt), also native Konvertierung (mit toString()) ) wird nicht genug sein. JSON'ing sollte die Informationen jedoch durchbringen.

Als Randbemerkung würde ich den Eigenschaftszuweisungsblock einfach so umschreiben:

tags.Push({article: article, gender: gender, brand: brand});
24
raina77ow

Schreiben als 

var formData = new FormData;
var array = ['1', '2'];
for (var i = 0; i < array.length; i++) {
    formData.append('array_php_side[]', array[i]);
}

du kannst genauso wie normal ein Array Post/Get per PHP erhalten.

10
Yosuke

verwenden Sie "xxx[]" als Namen des Feldes in formdata (Sie erhalten ein Array von - stringifizierten Objekten - in Ihrem Fall) 

also in deiner Schleife

$('.tag-form').each(function(i){
            article = $(this).find('input[name="article"]').val();
            gender = $(this).find('input[name="gender"]').val();
            brand = $(this).find('input[name="brand"]').val();
            this_tag = new Array();
            this_tag.article = article;
            this_tag.gender = gender;
            this_tag.brand = brand;
            //tags.Push(this_tag);    
            formdata.append('tags[]', this_tag);
...
9
halfbit

Funktion:

function appendArray(form_data, values, name){
    if(!values && name)
        form_data.append(name, '');
    else{
        if(typeof values == 'object'){
            for(key in values){
                if(typeof values[key] == 'object')
                    appendArray(form_data, values[key], name + '[' + key + ']');
                else
                    form_data.append(name + '[' + key + ']', values[key]);
            }
        }else
            form_data.append(name, values);
    }

    return form_data;
}

Benutzen:

var form = document.createElement('form');// or document.getElementById('my_form_id');
var formdata = new FormData(form);

appendArray(formdata, {
    'sefgusyg': {
        'sujyfgsujyfsg': 'srkisgfisfsgsrg'
    }, test1: 5, test2: 6, test3: 8, test4: 3, test5: [
        'sejyfgjy',
        'isdyfgusygf'
    ]
});
3
Doglas

Dies funktioniert bei mir, wenn ich Datei + Text + Array gesendet habe:

const uploadData = new FormData();
if (isArray(value)) {
  const k = `${key}[]`;
  uploadData.append(k, value);
} else {
  uploadData.append(key, value);
}


const headers = {
  'Content-Type': 'multipart/form-data',
};
1
llioor

Sie können das Array nur stringifizieren und anhängen. Sendet das Array als tatsächliches Array, auch wenn es nur ein Element enthält.

const array = [ 1, 2 ];
let formData = new FormData();
formData.append("numbers", JSON.stringify(array));
0
Marko Rochevski
var formData = new FormData;
var alphaArray = ['A', 'B', 'C','D','E'];
for (var i = 0; i < alphaArray.length; i++) {
    formData.append('listOfAlphabet', alphaArray [i]);
}

Und in Ihrer Anfrage erhalten Sie eine Reihe von Alphabeten.

0
Deva