FormData 인터페이스를 구현하지 않는 개체에서 'append'가 호출되었습니다.


87

jquery와 ajax를 사용하여 이미지를 업로드하려고합니다. 하지만 여기서 이상한 일이 일어났습니다. 콘솔에서 표시

TypeError : FormData 인터페이스를 구현하지 않는 개체에서 'append'가 호출되었습니다.

내가 여기서 뭘 잘못했는지 말해줘?

JS 스크립트

var prosrc=$("#pro_pix img").last().attr("src");
$("#logoform").on('change',function(event){
var postData = new FormData(this);
$("#pro_pix img").last().hide();
$("#pro_pix img").first().show();
event.preventDefault();
$.ajax(
    {
        url : "/function/pro_pic_upload.php",
        type: "POST",
        data : postData,
        success:function(data, textStatus, jqXHR)
        {
        $("#pro_pix img").last().show();
        $("#pro_pix img").first().hide();
        $("#pro_pix h6").text(data);
        },
        error: function(jqXHR, textStatus, errorThrown)
        {
            //if fails     
        }
    });
});

내 HTML 마크 업

 <div class="row">
    <!-- left column -->
    <div id="pro_pix" class="col-md-4 col-sm-6 col-xs-12">
      <div class="text-center">
        <img src="template/image/725.GIF" class="avatar img-circle img-thumbnail" style="display:none" alt="avatar">
        <img src="<?php echo $rowuser['profile_logo']; ?>" class="avatar img-circle img-thumbnail" alt="avatar">
        <h6>Upload a different photo...</h6>
        <form role="form" id="logoform" enctype="multipart/form-data">
        <input id="logo" name="logo" type="file" class="text-center center-block well well-sm">
        </form>
      </div>
    </div>

답변:


184

jquery와 함께 formdata를 사용하려면 올바른 옵션을 설정해야합니다.

$.ajax({
    url : "/function/pro_pic_upload.php",
    type: "POST",
    data : postData,
    processData: false,
    contentType: false,
    success:function(data, textStatus, jqXHR){
        $("#pro_pix img").last().show();
        $("#pro_pix img").first().hide();
        $("#pro_pix h6").text(data);
    },
    error: function(jqXHR, textStatus, errorThrown){
        //if fails     
    }
});

.ajax 참조

processData (기본값 : true)

유형 : 부울

기본적으로 데이터 옵션에 개체 (기술적으로 문자열 이외의 모든 항목)로 전달 된 데이터는 처리되고 기본 콘텐츠 유형 "application / x-www-form-urlencoded"에 맞는 쿼리 문자열로 변환됩니다. . DOMDocument 또는 기타 처리되지 않은 데이터를 보내려면이 옵션을 false로 설정하십시오.


혼란 스럽습니다. 제발 도와 주 시겠어요? 배열과 함께 파일과 문자열을 보내고 싶다고 가정합니다. 내 스크립트에서 이미지 파일과 사용자 이름이있는 문자열을 보내고 싶다고 가정합니다. 그렇게하는 방법? 파일과 문자열을 함께 보관하기 위해 json 또는 xml 또는 다른 배열을 만들 수 있습니까? 저는 초보자입니다. 이것은 어리석은 질문 일 수 있습니다. 나는 당신의 도움이 필요합니다 ..

1
항목을 추가하려면 FormData 개체의 append 메소드를 호출하기 만하면됩니다.postData.append("name",value);
Patrick Evans

객체와 같은 복잡한 항목 (예 {cat:"meow",dog:"bark"}:)에 대한 참고 사항 : 먼저 JSON.stringify를 사용해야 postData.append("name",JSON.stringify(someObject));합니다. 서버 쪽에서 json을 구문 분석합니다
Patrick Evans

1
잊지 마세요 : cache: false 지금 막 문제가 생겼습니다. 모든 것이 해결되었습니다.
Zri

감사합니다. 지난 한 시간 동안이 문제에 대해 고민했습니다!
user752746

34

AJAX에 다음 두 매개 변수를 추가하여 문제를 해결하십시오.

processData: false,
contentType: false,

잊지 마세요 : cache: false지금 막 문제가 생겼습니다. 모든 것이 해결되었습니다.
Zri

@ Zri, 의미는 cache: false무엇입니까?
파티 흐 머트 Doğancan

jQuery 문서에서 : cache (기본값 : true, dataType 'script'및 'jsonp'의 경우 false) 유형 : Boolean false로 설정하면 요청 된 페이지가 브라우저에 의해 캐시되지 않도록 강제합니다. 참고 : 캐시를 false로 설정하면 HEAD 및 GET 요청에서만 올바르게 작동합니다. GET 매개 변수에 "_ = {timestamp}"를 추가하여 작동합니다. 이 매개 변수는 GET에서 이미 요청한 URL에 POST가 수행되는 IE8을 제외하고 다른 유형의 요청에는 필요하지 않습니다.
Zri

1
@Zri GET요청을 사용 중일 수 있습니다 . 가 cache:false제대로 작동하지 않습니다 POST요청. 위의 의견에서 언급했듯이 HEADGET요청에 대해서만 작동 합니다. 그리고 FormData해야 폼 데이터를 전송하는 데 사용됩니다 POST대신을 GET. 따라서 양식 데이터를 제출할 때는 항상 POST를 사용하는 것이 좋습니다.
Lucky


2

첨가:

processData: false,
contentType: false,

파일에 확실히 도움이 될 것입니다. 그 외에도 페이지에 오류 또는 성공 메시지를 다시 전달하는 경우 json을 사용하여 삶을 더 쉽게 만들고 싶을 것입니다.

예:

dataType: 'json',

이것은 당신의 응답을 파싱하는데 도움이 될 것입니다. 그것이 없으면 오류가 발생합니다.


0

라인을 편집하십시오.

var postData = new FormData(this);

에:

var postData = new FormData($(this));
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.