AJAX 파일 업로드에 FormData를 사용하는 방법은 무엇입니까?


220

이것은 드래그 앤 드롭 기능을 사용하여 동적으로 생성하는 HTML입니다.

<form method="POST" id="contact" name="13" class="form-horizontal wpc_contact" novalidate="novalidate" enctype="multipart/form-data">
<fieldset>
    <div id="legend" class="">
        <legend class="">file demoe 1</legend>
        <div id="alert-message" class="alert hidden"></div>
    </div>

    <div class="control-group">
        <!-- Text input-->
        <label class="control-label" for="input01">Text input</label>
        <div class="controls">
            <input type="text" placeholder="placeholder" class="input-xlarge" name="name">
            <p class="help-block" style="display:none;">text_input</p>
        </div>
        <div class="control-group">  </div>
        <label class="control-label">File Button</label>

        <!-- File Upload --> 
        <div class="controls">
            <input class="input-file" id="fileInput" type="file" name="file">
        </div>
    </div>
    <div class="control-group">    

        <!-- Button --> 
        <div class="controls">
            <button class="btn btn-success">Button</button>
        </div>
    </div>
</fieldset>
</form> 

이것은 내 JavaScript 코드입니다.

<script>
    $('.wpc_contact').submit(function(event){
        var formname = $('.wpc_contact').attr('name');
        var form = $('.wpc_contact').serialize();               
        var FormData = new FormData($(form)[1]);

        $.ajax({
            url : '<?php echo plugins_url(); ?>'+'/wpc-contact-form/resources/js/tinymce.php',
            data : {form:form,formname:formname,ipadd:ipadd,FormData:FormData},
            type : 'POST',
            processData: false,
            contentType: false,
            success : function(data){
            alert(data); 
            }
        });
   }

1
이 (읽어야 developer.mozilla.org/en-US/docs/Web/API/FormData/append을 ) formData();APPEND 방법은 파일에 대한 세번째 매개 변수가 있습니다.
www139

답변:


458

올바른 양식 데이터 사용을 위해서는 2 단계를 수행해야합니다.

준비

처리를 위해 FormData ()에 전체 양식을 제공 할 수 있습니다.

var form = $('form')[0]; // You need to use standard javascript object here
var formData = new FormData(form);

또는 FormData ()에 정확한 데이터를 지정하십시오.

var formData = new FormData();
formData.append('section', 'general');
formData.append('action', 'previewImg');
// Attach file
formData.append('image', $('input[type=file]')[0].files[0]); 

양식 보내기

jquery를 사용한 Ajax 요청은 다음과 같습니다.

$.ajax({
    url: 'Your url here',
    data: formData,
    type: 'POST',
    contentType: false, // NEEDED, DON'T OMIT THIS (requires jQuery 1.6+)
    processData: false, // NEEDED, DON'T OMIT THIS
    // ... Other options like success and etc
});

이 후에는 일반 양식을 제출하는 것처럼 아약스 요청을 보냅니다. enctype="multipart/form-data"

업데이트 :이 요청은없이 작동 할 수 없습니다 type:"POST" 모든 파일을 POST 요청을 통해 보내야하므로이 요청은 옵션 .

참고 : jQuery 1.6 이상contentType: false 에서만 사용 가능


1
Ajax 호출에서 "enctype"을 설정할 수 있습니까? 문제가있을 수 있습니다. 또는 FormData 객체에서 설정할 수 있습니까?
Wouter

할 수 있습니다. 이를 위해 내 코드에서 파일 업로드를 위해이 작업이 완료된 후 행을 참조하십시오.
Spell

1
@Spell 컨트롤러에서 데이터를 얻는 방법은 무엇입니까? 보내야 getCsrfToken합니까?
Юрий Светлов

@ ЮрийСветлов 사용하는 컨트롤러 유형에 따라 다릅니다. 서버 쪽 또는 앞쪽 컨트롤러입니까? 여기서 CSRF 보호를 해결하려고하십니까?
주문 :

1
@ManthanJamdagni 얻을 때 $('form')jQuery 객체를 반환합니다. 그러나 여기서는 jQuery 기능이없는 일반 js 객체가 필요합니다. 그래서 우리는 [0]표기법으로 규칙적인 객체를 얻는 것 입니다. 이 구성 대신 전화 document.getElementById()또는 간단한 전화를 걸 수 있습니다 .
철자

37

평판이 충분하지 않아서 위의 설명을 추가 할 수 없지만 위의 답변은 추가해야 할 경우를 제외하고는 거의 완벽했습니다.

유형 : "POST"

.ajax 호출에. 나는 내가 잘못한 것을 알아 내려고 몇 분 동안 머리를 긁적이었다. 따라서 이것은 전체 스 니펫입니다.

위의 답변에 대한 완전한 신용, 이것은 약간의 조정입니다. 이것은 다른 사람이 붙어서 명백한 것을 볼 수없는 경우를 대비 한 것입니다.

  $.ajax({
    url: 'Your url here',
    data: formData,
    type: "POST", //ADDED THIS LINE
    // THIS MUST BE DONE FOR FILE UPLOADING
    contentType: false,
    processData: false,
    // ... Other options like success and etc
})

20
<form id="upload_form" enctype="multipart/form-data">

CodeIgniter 파일 업로드가 포함 된 jQuery :

var formData = new FormData($('#upload_form')[0]);

formData.append('tax_file', $('input[type=file]')[0].files[0]);

$.ajax({
    type: "POST",
    url: base_url + "member/upload/",
    data: formData,
    //use contentType, processData for sure.
    contentType: false,
    processData: false,
    beforeSend: function() {
        $('.modal .ajax_data').prepend('<img src="' +
            base_url +
            '"asset/images/ajax-loader.gif" />');
        //$(".modal .ajax_data").html("<pre>Hold on...</pre>");
        $(".modal").modal("show");
    },
    success: function(msg) {
        $(".modal .ajax_data").html("<pre>" + msg +
            "</pre>");
        $('#close').hide();
    },
    error: function() {
        $(".modal .ajax_data").html(
            "<pre>Sorry! Couldn't process your request.</pre>"
        ); // 
        $('#done').hide();
    }
});

당신이 사용할 수있는.

var form = $('form')[0]; 
var formData = new FormData(form);     
formData.append('tax_file', $('input[type=file]')[0].files[0]);

또는

var formData = new FormData($('#upload_form')[0]);
formData.append('tax_file', $('input[type=file]')[0].files[0]); 

둘 다 작동합니다.


1
$(document).ready(function () {
    $(".submit_btn").click(function (event) {
        event.preventDefault();
        var form = $('#fileUploadForm')[0];
        var data = new FormData(form);
        data.append("CustomField", "This is some extra data, testing");
        $("#btnSubmit").prop("disabled", true);
        $.ajax({
            type: "POST",
            enctype: 'multipart/form-data',
            url: "upload.php",
            data: data,
            processData: false,
            contentType: false,
            cache: false,
            timeout: 600000,
            success: function (data) {
                console.log();
            },
        });
    });
});

0
View:
<label class="btn btn-info btn-file">
Import <input type="file" style="display: none;">
</label>
<Script>
$(document).ready(function () {
                $(document).on('change', ':file', function () {
                    var fileUpload = $(this).get(0);
                    var files = fileUpload.files;
                    var bid = 0;
                    if (files.length != 0) {
                        var data = new FormData();
                        for (var i = 0; i < files.length ; i++) {
                            data.append(files[i].name, files[i]);
                        }
                        $.ajax({
                            xhr: function () {
                                var xhr = $.ajaxSettings.xhr();
                                xhr.upload.onprogress = function (e) {
                                    console.log(Math.floor(e.loaded / e.total * 100) + '%');
                                };
                                return xhr;
                            },
                            contentType: false,
                            processData: false,
                            type: 'POST',
                            data: data,
                            url: '/ControllerX/' + bid,
                            success: function (response) {
                                location.href = 'xxx/Index/';
                            }
                        });
                    }
                });
            });
</Script>
Controller:
[HttpPost]
        public ActionResult ControllerX(string id)
        {
            var files = Request.Form.Files;
...

9
일반적으로 답변과 함께 설명을 제공하는 것이 좋습니다.
ouflak

0
$('#form-withdraw').submit(function(event) {

    //prevent the form from submitting by default
    event.preventDefault();



    var formData = new FormData($(this)[0]);

    $.ajax({
        url: 'function/ajax/topup.php',
        type: 'POST',
        data: formData,
        async: false,
        cache: false,
        contentType: false,
        processData: false,
        success: function (returndata) {
          if(returndata == 'success')
          {
            swal({
              title: "Great",
              text: "Your Form has Been Transfer, We will comfirm the amount you reload in 3 hours",
              type: "success",
              showCancelButton: false,
              confirmButtonColor: "#DD6B55",
              confirmButtonText: "OK",
              closeOnConfirm: false
            },
            function(){
              window.location.href = '/transaction.php';
            });
          }

          else if(returndata == 'Offline')
          {
              sweetAlert("Offline", "Please use other payment method", "error");
          }
        }
    });



}); 

0

실제로 문서는 jquery가 짜증나는 경우 XMLHttpRequest().send() 에 간단히 다중 형식 데이터 를 보내는 데 사용할 수 있음을 보여줍니다.


0

document.getElementById ( "yourFormElementID") 와 같이 id로 요소를 찾으려면 원시 Javascript를 사용하는 것이 좋습니다 .

$.ajax( {
      url: "http://yourlocationtopost/",
      type: 'POST',
      data: new FormData(document.getElementById("yourFormElementID")),
      processData: false,
      contentType: false
    } ).done(function(d) {
           console.log('done');
    });

-4

좋은 아침.

여러 이미지를 업로드 할 때도 같은 문제가있었습니다. 해결책은 내가 생각했던 것보다 간단했다 : 이름 필드에 []를 포함시킨다.

<input type="file" name="files[]" multiple>

FormData를 수정하지 않았습니다.


이것은 질문이 제기하는 문제와 아무 관련이 없으며 PHP가 동일한 이름을 가진 여러 값으로 양식 데이터를 처리하는 방식의 특이성입니다.
Quentin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.