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.