2012-12-24 9 views
9

Ich verwende FormData zum Hochladen von Dateien. Ich möchte auch eine Reihe anderer Daten senden.Kann ich ein Array an 'Formdaten' in Javascript anhängen?

Wenn ich nur das Bild senden, funktioniert es gut. Wenn ich Text an die Formdata angehängt habe, funktioniert es einwandfrei. Wenn ich versuche, das Array "Tags" unten anzuhängen, funktioniert alles andere gut, aber es wird kein Array gesendet.

Alle bekannten Probleme mit FormData und Anfügen von Arrays?

Instantiate Formdata:

formdata = new FormData();

Das Array I erstellen. Console.log zeigt an, 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); 

Wie ich es senden:

 // 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(); 
      } 
     }); 
+2

Warum fügen Sie Eigenschaften zu einem Array? Verwenden Sie stattdessen ein Objekt. – Musa

+1

Ich vermute einen PHP-Hintergrund. Arrays funktionieren in Javascript nicht so. – kapa

+0

Das ist es genau :) Ich werde ein Objekt verwenden. –

Antwort

18

Wie wäre das?

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

... und dementsprechend es mit json_decode auf dem Server Deparse. Siehe, kann der zweite Wert von FormData.append sein ...

ein Blob, eine Datei oder einen String, wenn weder wird der Wert auf einen String umgewandelt

Die Art und Weise sehe ich es, Ihre tags Array enthält Objekte (@Musa ist richtig, BTW; machen this_tag ein Array, dann Zuweisung von String-Eigenschaften macht keinen Sinn; verwenden Sie stattdessen plain-Objekt), so native Konvertierung (mit toString()) wird nicht genug sein. JSON'ing sollte die Informationen jedoch erhalten.

Als Nebenbei bemerkt, würde ich die Eigenschaft umschreiben Block zuweisen dies nur in: - Zeichenfolgeobjekte -

tags.push({article: article, gender: gender, brand: brand}); 
+0

Das ist ein guter Punkt, danke! Lassen Sie mich es versuchen –

+0

Das einzige Problem ist JSON.Stringify() gibt mir die Ausgabe mit Escape-Anführungszeichen. Das macht es unmöglich, auf der PHP-Seite interpretiert zu werden. Weißt du, wie man entschichtet? –

+0

Hier ist die Ausgabe [{"article \": \ "Article \", \ "gender \": \ "Gender \", \ "brand \": \ "Brand \"}] –

8

Verwendung "xxx[]" als Namen des Feldes in Formulardaten (Sie werden eine Reihe von bekommen Sie Fall)

so innerhalb der 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); 
... 
+0

Brilliant! Meine Bedürfnisse sind den OP's ähnlich, aber ich möchte das 'FormData'-Objekt mit einem Array von Dateieingaben füllen. Ich versuche, eine beliebige Anzahl von Dateien mit AJAX hochzuladen, die der Benutzer mit Standardformulareingabeelementen angibt. Die serverseitige Implementierung erfordert, dass alle Dateien unter einem einzigen Schlüssel verschachtelt sind, und dies war die einzige Möglichkeit, die ich erreichen konnte. Diese Array-Notationstechnik wird unter https://developer.mozilla.org/en-US/docs/Web/API/FormData/append nicht erwähnt. Ich kann dir nicht genug danken, Halbbit! –

+0

Ich habe der oben zitierten Dokumentation ein Beispiel hinzugefügt, das diese spezielle Verwendung demonstriert. Die Möglichkeit, die eckigen Klammern einzufügen, ist sehr nützlich, wenn es sich um Uploads mit mehreren Dateien handelt, da die resultierende Datenstruktur dem Schleifen so viel förderlicher ist. Danke noch einmal! –

6

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]); 
} 

können Sie wie normale Array Post/Get von PHP bekommen.

+0

Wie Sie diese Daten auf der Serverseite sammeln –

1

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

Verwendung:

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' 
    ] 
}); 
Verwandte Themen