【问题标题】:Can I append an array to 'formdata' in javascript?我可以在javascript中将数组附加到“formdata”吗?
【发布时间】:2012-12-11 04:22:37
【问题描述】:

我正在使用 FormData 上传文件。我还想发送一组其他数据。

当我只发送图像时,它工作正常。当我将一些文本附加到表单数据时,它工作正常。当我尝试在下面附加“标签”数组时,其他一切正常,但没有发送数组。

FormData 和附加数组有任何已知问题吗?

实例化formData:

formdata = new FormData();

我创建的数组。 Console.log 显示一切正常。

        // 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);

我如何发送它:

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

【问题讨论】:

  • 为什么要向数组添加属性?改为使用对象。
  • 我怀疑有 PHP 背景。数组在 Javascript 中并不是这样工作的。
  • 就是这样 :) 我将使用一个对象。

标签: javascript jquery arrays multipartform-data


【解决方案1】:

这个怎么样?

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

... 并相应地在服务器上使用json_decode 对其进行解析。看,FormData.append 的第二个值可以是...

Blob、File 或字符串,如果两者都不是,则将值转换为 字符串

在我看来,您的 tags 数组包含对象(@Musa 是对的,顺便说一句;使 this_tag 成为一个数组,然后为其分配字符串属性没有意义;请改用普通对象),所以本机转换(toString())是不够的。不过,JSON'ing 应该可以获取信息。

作为旁注,我会将属性分配块重写为:

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

【讨论】:

  • 唯一的问题是 JSON.stringify() 给了我带有转义引号的输出。这使得它无法在 PHP 端进行解释。你知道如何去字符串化吗?
  • 这里是输出 [{\"article\":\"Article\",\"gender\":\"Gender\",\"brand\":\"Brand\"} ]
  • 如果您正在使用带有自动映射或类似功能的 asp.net,那么这个答案就是您所需要的。 stackoverflow.com/a/28434829/625581
  • 嗨@raina77ow 我想喜欢这个发送数组,但服务器端我没有得到这个数组对象图像正在获取但数组没有得到?你能帮我吗
  • 不应该这样做。简单的方法是附加到带有方括号的键。
【解决方案2】:

写成

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

您可以通过 php 接收正常的数组 post/get。

【讨论】:

  • 如何在服务器端收集这些数据
  • @RahulMatte 服务器端通过 GET 发送:print_r($_GET['array_php_side']); 结果:Array([0] =&gt; 1, [1] =&gt; 2)
【解决方案3】:

使用"xxx[]" 作为formdata 中字段的名称(您将获得一个字符串化对象数组-在您的情况下)

所以在你的循环中

$('.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);
...

【讨论】:

  • 太棒了!我的需求类似于 OP,但我想用文件输入数组填充 FormData 对象。我正在尝试使用用户使用标准表单输入元素指定的 AJAX 上传任意数量的文件。服务器端实现要求所有文件嵌套在一个键下,这是我能够实现的唯一方法。 developer.mozilla.org/en-US/docs/Web/API/FormData/append 绝对没有提到这种数组符号技术。太感谢你了,半点!
  • 我在上面引用的文档中添加了一个示例来演示此特定用法。在处理多文件上传时,包含方括号的功能非常有用,因为生成的数据结构更有利于循环。再次感谢!
【解决方案4】:

我们可以这样做。

formData = new FormData;
words = ["apple", "ball", "cat"]
words.forEach((item) => formData.append("words[]", item))

// verify the data
console.log(formData.getAll("words[]"))
//["apple", "ball", "cat"]

在服务器端你会得到words = ["apple", "ball", "cat"]

【讨论】:

  • 这对我不起作用。我得到了words[] : (binary) words[] : (binary)
【解决方案5】:

功能:

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

用途:

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

【讨论】:

    【解决方案6】:

    你可以这样做:

    var formData = new FormData();
    formData.append('array[key1]', this.array.key1);
    formData.append('array[key2]', this.array.key2);
    

    【讨论】:

      【解决方案7】:
      var formData = new FormData;
      var alphaArray = ['A', 'B', 'C','D','E'];
      for (var i = 0; i < alphaArray.length; i++) {
          formData.append('listOfAlphabet', alphaArray [i]);
      }
      

      并且在您的请求中,您将获得字母数组。

      【讨论】:

      • 绝妙的想法,但这仅在使用括号[] 时才在我的代码中有效:formData.append('listOfAlphabet[]', alphaArray [i]);。否则 PHP 不会得到完整的数组,而只会得到最后一项。
      【解决方案8】:
      var formData = new FormData; var arr = ['item1', 'item2', 'item3'];
      
      arr.forEach(item => {
          formData.append(
              "myFile",item
          ); });
      

      【讨论】:

        【解决方案9】:

        您只能对数组进行字符串化并附加它。将数组作为实际数组发送,即使它只有一项。

        const array = [ 1, 2 ];
        let formData = new FormData();
        formData.append("numbers", JSON.stringify(array));
        

        【讨论】:

          【解决方案10】:

          当我发送文件 + 文本 + 数组时,这对我有用:

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

          【讨论】:

            【解决方案11】:

            我就是这样做的:

            const data = new FormData();
            data.append('id', class.id);
            data.append('name', class.name);
            
            class.people.forEach((person, index) => {
                data.append(`people[${index}].id`, person.id);
                data.append(`people[${index}].firstname`, person.firstname);
                data.append(`people[${index}].lastname`, person.lastname);
            
                // Append images
                person.images.forEach((image, imageIndex) =>
                    data.append(`people[${index}].images`, {
                        name: 'image' + imageIndex,
                        type: 'image/jpeg',
                        uri: image,
                    })
                );
            });
            

            我在前端使用 React,在后端使用 Asp.Net。

            【讨论】:

              【解决方案12】:

              我在 vuejs 中使用 formData 发送文件(数组)
              对我来说,下面的代码正在运行

                      if(this.requiredDocumentForUploads.length > 0) {
                          this.requiredDocumentForUploads.forEach(file => {
                              var name = file.attachment_type  // attachment_type is using for naming
                              if(document.querySelector("[name=" + name + "]").files.length > 0) {
                                  formData.append("requiredDocumentForUploadsNew[" + name + "]", document.querySelector("[name=" + name + "]").files[0])
                              }
                          })
                      }
              

              【讨论】:

                【解决方案13】:

                在前端使用 JSON.stringify 如下:

                ...
                ...
                const entityData = new FormData();
                entityData.append("Entities Open", JSON.stringify(login_entities));
                axios
                .post("/oneview/load_entity", entityData)
                .then(response => {
                   var entity_group = response.data.entity_group;
                   var entity_code = response.data.entity_code;
                   var entity_name = response.data.entity_name;
                })
                .catch(error => {
                   console.log(error);
                   alert(error);
                });
                

                然后在后端使用 json.loads() 如下:

                ...
                ...
                login_entities = json.loads(request.POST.get('Entities Open'))
                for i in login_entities:
                   ...
                   ...
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-12-03
                  • 2019-05-13
                  • 2011-09-06
                  • 2020-06-23
                  • 2023-01-06
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多