【问题标题】:FormData.append("key", "value") is not workingFormData.append("key", "value") 不起作用
【发布时间】:2011-12-06 19:42:47
【问题描述】:

你能告诉我这有什么问题吗:

var formdata = new FormData();
formdata.append("key", "value");
console.log(formdata);

我的输出看起来像这样,我找不到我的“键”-“值”对

FormData
*__proto__: FormData
**append: function append() { [native code] }
***arguments: null
***caller: null
***length: 0
***name: "append"
***prototype: append
***__proto__: function Empty() {}
*constructor: function FormData() { [native code] }
**arguments: null
**caller: null
**length: 0
**name: "FormData"
**prototype: FormData
**toString: function toString() { [native code] }
*__proto__: Object
**__proto__: Object
**__defineGetter__: function __defineGetter__() { [native code] }
**__defineSetter__: function __defineSetter__() { [native code] }
**__lookupGetter__: function __lookupGetter__() { [native code] }
**__lookupSetter__: function __lookupSetter__() { [native code] }
**constructor: function Object() { [native code] }
**hasOwnProperty: function hasOwnProperty() { [native code] }
**isPrototypeOf: function isPrototypeOf() { [native code] }
**propertyIsEnumerable: function propertyIsEnumerable() { [native code] }
**toLocaleString: function toLocaleString() { [native code] }
**toString: function toString() { [native code] }
**valueOf: function valueOf() { [native code] }

我无法理解!昨天很好用,今天我的头撞了好多次键盘! Firefox,Chrome,都一样:/

【问题讨论】:

    标签: javascript html form-data


    【解决方案1】:

    Chrome 50+ 和 Firefox 39+(分别为 44+)的新功能:

    • formdata.entries()(与 Array.from() 结合使用以获得可调试性)
    • formdata.get(key)
    • 还有更多非常有用的方法

    原答案:

    我通常会“调试”FormData 对象,只需将其发送(任何地方!)并检查浏览器日志(例如 Chrome 开发工具的“网络”选项卡)。

    您不需要相同的 Ajax 框架。你不需要任何细节。发送即可:

    var xhr = new XMLHttpRequest;
    xhr.open('POST', '/', true);
    xhr.send(data);
    

    简单。

    【讨论】:

    • 谢谢 - 这是通过在 Chrome 控制台中键入 FormData 对象来获取它的一种有用的快速方法。
    • According to Google formData 方法已添加到 Chrome v50 中。
    • 如果是 Safari 之类的移动浏览器,您会如何查看浏览器日志?我在一个用于移动设备的网络应用程序中使用 FormData 对象,但不知道如何调试它。
    • @kiwicomb123 Formdata.entries() + Array.from() + alert() 如果它足够现代,或者查看mobile debugging
    • 所以没有边缘或ie11?
    【解决方案2】:

    你说它不起作用。你期望发生什么?

    无法从FormData 对象中获取数据;它只是供您使用与XMLHttpRequest 对象一起发送数据(用于send 方法)。

    大约五年后更新:在一些较新的浏览器中,这不再是正确的,您现在可以看到提供给FormData 的数据,除了只是将数据填充到其中。 See the accepted answer 了解更多信息。

    【讨论】:

    • 好吧……这太糟糕了。为什么我不能在控制台中记录 FormData? :-( 这对我来说毫无意义,因为我认为这是一个常见的对象
    • @netzaffin:只要您打开网络选项卡并开始记录,Firebug 和 Chrome 的检查器都可以让您在 XHR 请求中查看发送的请求参数,因此您应该能够继续那。您还可以创建一个包装器对象来记录字段并附加到 FormData,然后检查其值(不要忘记发送内部 FormData 而不是包装器对象)。
    • 至少,我可以检查formdata对象里面是否有文件吗?
    • @MarceloBarbosa:您似乎无法从中获取任何信息。您只需要自己保留这些信息。
    • 正如@Jesper 所指出的,您可以在 Developer tools 的网络选项卡选项卡中检查发送的 XHR 请求,那里有 Params 选项,甚至可以让您查看发送的 POST 请求的内容。还有响应。
    【解决方案3】:

    您可能遇到了与我最初遇到的相同的问题。我试图使用 FormData 来获取所有输入文件以上传图像,但同时我想将会话 ID 附加到传递给服务器的信息中。一直以来,我认为通过附加信息,您可以通过访问对象在服务器中看到它。我错了。当您追加到 FormData 时,检查服务器上追加信息的方法是通过简单的$_POST['*your appended data*'] 查询。像这样:

    js:

    $('form').submit(function(){
        var sessionID = 8;
        var formData = new FormData(this);
        formData.append('id', sessionID);
    
        $.ajax({
            url: "yoururl.php",
            data: formData,
            processData: false,
            contentType: false,
            type: 'POST',
            success: function(data){
                alert(data);
            }
        });
    });
    

    然后在php上:

    $sessionID = $_POST['id'];
    $files = $_FILES['image'];
    
    $foreach ($files as $key=>val){
        //...
    }
    

    【讨论】:

      【解决方案4】:

      如果您在 Chrome 中,您可以查看帖子数据

      这里是如何检查帖子数据

      1. 转到网络选项卡
      2. 查找您发送帖子数据的链接
      3. 点击它
      4. 在 Headers 中,您可以检查 Request Payload 以检查 post 数据

      【讨论】:

        【解决方案5】:

        表单数据未出现在 Web 浏览器控制台中

        for (var data of formData) {
          console.log(data);
        }
        

        试试这个方法会显示的

        【讨论】:

          【解决方案6】:

          你可以看到 你需要使用console.log(formData.getAll('your key')); 看着 https://developer.mozilla.org/en-US/docs/Web/API/FormData/getAll

          【讨论】:

            【解决方案7】:

            在我的 Edge 浏览器上:

              const formData = new FormData(this.form);
              for (const [key, value] of formData.entries()) {
                  formObject[key] = value;
              }
            

            给我同样的错误

            所以我没有使用FormData,我只是手动构建一个对象

            import React from 'react';    
            import formDataToObject from 'form-data-to-object';
            
              ...
            
            let formObject = {};
            
            // EDGE compatibility -  replace FormData by
            for (let i = 0; i < this.form.length; i++) {
              if (this.form[i].name) {
                formObject[this.form[i].name] = this.form[i].value;
              }
            }
            
            const data = formDataToObject.toObj(formObject): // convert "user[email]":"customer@mail.com" => "user":{"email":"customer@mail.com"}
            
            const orderRes = await fetch(`/api/orders`, {
                    method: 'POST',
                    credentials: 'same-origin',
                    headers: {
                      'Content-Type': 'application/json'
                    },
                    body: JSON.stringify(data)
                  });
            
            const order = await orderRes.json();
            

            【讨论】:

              【解决方案8】:

              反应版本

              确保有'content-type': 'multipart/form-data'的标题

              _handleSubmit(e) {
                  e.preventDefault();
                  const formData = new FormData();
                        formData.append('file', this.state.file);
                  const config = {
                    headers: {
                      'content-type': 'multipart/form-data'
                    }
                  }
              
                   axios.post("/upload", formData, config)
                       .then((resp) => {
                           console.log(resp)
                       }).catch((error) => {
                  })
                }
              
                _handleImageChange(e) {
                  e.preventDefault();
                  let file = e.target.files[0];
                  this.setState({
                    file: file
                  });
                }
              

              查看

                #html
               <input className="form-control"
                  type="file" 
                  onChange={(e)=>this._handleImageChange(e)} 
               />
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2021-04-20
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-12-12
                相关资源
                最近更新 更多