2014-08-30 1 views
0

제출 된 양식의 숨겨진 입력 필드를 통해 양식 데이터를 FormData();으로 전달하는 Ajax 호출을 통해 파일을 외부 서버에 업로드하면 모든 것이 잘 동작합니다.Ajax를 통해 파일 업로드 append()가 작동하지 않는 추가 데이터

그러나 양식 데이터를 FormData();에 전달할 때 FormData();에 추가하면 작동하지 않습니다.

어떻게 데이터를 추가 할 때 숨겨진 필드를 통해 데이터를 전달할 때 데이터 처리가 어떻게 다른지 알 수 있습니다. 두 번째 경우에는 작동하지 않기 때문에.

이 방법은 작동합니다

$('#myform').on('submit', function(e){ 
    var formdata = new FormData(this); 
    $.ajax({ 
     url: 'https://external-website.com/', 
     type: 'POST', 
     data: formdata, 
     processData: false, 
     contentType: false 
    }); 
}); 

<form id="myform" method="post" enctype="multipart/form-data"> 
    <input type="hidden" name="key1" value="value1"> 
    <input type="hidden" name="key2" value="value2"> 
    <input type="file" name="file"> 
    <input type="submit" value="Upload"> 
</form> 

이 방법은 작동하지 않습니다

$('#myform').on('submit', function(e){ 
    var formdata = new FormData(this); 
    formdata.append('key1', 'value1'); 
    formdata.append('key2', 'value2'); 
    $.ajax({ 
     url: 'https://external-website.com/', 
     type: 'POST', 
     data: formdata, 
     processData: false, 
     contentType: false 
    }); 
}); 


<form id="myform" method="post" enctype="multipart/form-data"> 
    <input type="file" name="file"> 
    <input type="submit" value="Upload"> 
</form> 
+0

당신은 내 대답을 가장 좋은 것으로 표시했지만,'e.preventDefault()'를 사용한다면 아무 것도 대답하지 않습니다. 문제의 진정한 원인을 찾아 냈습니까? –

+0

이 서버가 사용중인 플랫폼/기술/스택이 무엇인지 알고 있습니까? 어떤 종류의 공공 서비스인가요? 나는 접근하고 시도 할 수 있습니까? 나는 그것이 왜 작동하지 않는지 궁금 해서요. –

+0

감사합니다. 나는 PHP 녀석이 아니지만 내가 Google에서이 함수를 이해하면 특정 매개 변수가있는 폼을 생성 할 수 있습니다. 제출시 Amazon s3에 파일을 uppload하고 어딘가에 저장할 수 있습니다. 필드를 숨기고 싶지 않으므로 이러한 매개 변수를 FormData에 추가하려면 일부 js 코드를 생성해야하며 아마도 오류 일 수 있습니다. 오타 또는 인코딩 문제 또는 다른 것. 나는 당신이 폼과 js 코드에 의해 생성 된 요청을 매우 철저하게 비교할 것을 제안한다. 오류가 있어야합니다. –

답변

1

난 당신이 양식은 또한 일반적인 방법을 제출 의미하는 핸들러를 제출 형태로 e.preventDefault();를 호출 표시되지 않습니다 (당신이 보낸 아약스 요청 외에도). 첫 번째 예에서 작동하는 경우 일 수 있습니다. 양식의 모든 필드가 있고 제출 된 것입니다. dev 도구의 네트워크 탭을 확인하여 요청이 어떻게 이루어지고 페이지가 다시로드되는지 확인하십시오. 또한 수신 된 요청 수와 매개 변수를 서버에서 추적합니다.

+0

'e.preventDefault(); '를 사용합니다. 예제에는 포함하지 않았습니다. 두 방법 모두 동일한 매개 변수를 보냅니다. 귀하의 조언을 주셔서 감사합니다,하지만이 문제는 여전히 나에게 수수께끼입니다. – qwaz

+0

좋아, 최근 크롬에서 코드를 테스트했는데 두 예제에서 보낸 요청은 기본적으로 동일합니다. 두 번째 예에서는 페이로드의 첫 번째 부분이 파일이고 key1과 key2는 제외됩니다. 어떤 서버에 제출 하시겠습니까? 요청 페이로드를 확인해보십시오. –

+0

감사합니다. 파일 및 키 순서로이 문제가 발생했습니다. 파일 앞에 키가 있어야합니다. 귀하의 의견은이 문제를 해결할 수있는 아이디어를 제공해 주셨습니다. – qwaz

관련 문제