FormData.append ( "key", "value")가 작동하지 않습니다.


107

이것에 무엇이 잘못되었는지 말해 줄 수 있습니까?

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, 둘 다 동일 : /

답변:


127

Chrome 50+ 및 Firefox 39+의 새로운 기능 (resp. 44+) :

  • formdata.entries()( Array.from()디버깅 가능성을 위해와 결합 )
  • formdata.get(key)
  • 더 유용한 방법

원래 답변 :

FormData객체 를 '디버그'하기 위해 일반적으로하는 일은 객체를 (어디서나!) 보내고 브라우저 로그 (예 : Chrome devtools의 네트워크 탭)를 확인하는 것입니다.

동일한 Ajax 프레임 워크가 필요하지 않습니다. 세부 정보가 필요하지 않습니다. 그냥 보내주세요 :

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

쉬운.


감사합니다. 이것은 Chrome 콘솔에 입력하여 FormData 개체를 가져 오는 유용한 빠른 방법이었습니다.
Dan Smart

Google formData 메서드 에 따르면 Chrome v50에 추가되었습니다.
thdoan

Safari와 같은 모바일 브라우저 인 경우 브라우저 로그를 어떻게 봅니까? 모바일 용 웹 앱에서 FormData 개체를 사용하고 있으며 디버깅 방법을 알 수 없습니다.
kiwicomb123

1
@ kiwicomb123 Formdata.entries()+ Array.from()+ alert()그것으로 현대 충분한, 또는보기의 경우 모바일 디버깅
Rudie

그래서 가장자리 또는 ie11이 없습니까?
SuperUberDuper

50

작동하지 않는다고합니다. 어떤 일이 일어나기를 기대하십니까?

FormData개체 에서 데이터를 가져올 방법이 없습니다 . XMLHttpRequest객체 와 함께 데이터를 보내는 데 사용하기위한 것입니다 ( send메서드 용).

거의 5 년 후 업데이트 : 일부 최신 브라우저에서는 더 이상 사실이 아니며 이제 FormData데이터를 채우는 것 외에도에 제공된 데이터를 볼 수 있습니다. 자세한 내용은 허용되는 답변 을 참조하십시오.


20
좋아요 .. 내 콘솔에서 FormData를 기록 할 수없는 이유는 무엇입니까? :-( 이것은 단지 내가 생각하기 때문에 그것이 일반적인 목적은 나에게 아무 의미
netzaffin

12
@netzaffin : Firebug와 Chrome의 인스펙터는 네트워크 탭을 열고 로깅을 시작하는 한 XHR 요청에서 전송 된 요청 매개 변수를 볼 수있게 해주므로이를 수행 할 수 있어야합니다. 필드를 기록하고 FormData에 추가하는 래퍼 개체를 만든 다음 값을 확인할 수도 있습니다 (래퍼 개체 대신 내부 FormData를 보내는 것을 잊지 않음).
Jesper 2011 년

1
적어도 formdata개체에 파일이 있는지 확인할 수 있습니까?
MarceloBarbosa

1
@MarceloBarbosa : 정보를 얻을 수없는 것 같습니다. 이 정보를 직접 보관하면됩니다.
Jesper 2015

@Jesper가 지적했듯이 개발자 도구의 네트워크 탭 탭에서 보낸 XHR 요청을 확인할 수 있으며, 보낸 POST 요청의 내용을 볼 수있는 Params 옵션도 있습니다. 또한 응답.
Anirudh

23

내가 처음에 겪었던 것과 같은 문제가 있었을 수도 있습니다. 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){
    //...
}

17

Chrome을 사용하는 경우 게시물 데이터를 확인할 수 있습니다.

Post 데이터를 확인하는 방법은 다음과 같습니다.

  1. 네트워크 탭으로 이동
  2. 게시물 데이터를 보내는 링크를 찾으십시오.
  3. 그것을 클릭하십시오
  4. 헤더에서 Request Payload를 확인하여 게시 데이터를 확인할 수 있습니다.

Chrome의 DevTools



5

웹 브라우저 콘솔에 양식 데이터가 나타나지 않습니다.

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

이 방법으로 시도해보십시오.


2

제 경우에는 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();

2

반응 버전

헤더가 있는지 확인하십시오. '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)} 
 />
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.