AJAX dosya yükleme için FormData nasıl kullanılır?


220

Bu, sürükle bırak işlevini kullanarak dinamik olarak oluşturduğum HTML kodum.

<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> 

Bu benim JavaScript kodum:

<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
Bunu okumalısınız ( developer.mozilla.org/en-US/docs/Web/API/FormData/append ) formData();append yönteminin bir dosya için isteğe bağlı bir üçüncü parametresi vardır.
www139

Yanıtlar:


458

Doğru form veri kullanımı için 2 adım yapmanız gerekir.

Hazırlıklar

Tüm formunuzu işlenmek üzere FormData () öğesine verebilirsiniz.

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

veya FormData () için kesin verileri belirtme

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

Form gönderme

Jquery ile Ajax isteği şöyle görünür:

$.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
});

Bundan sonra normal form göndermek gibi ajax isteği gönderecek enctype="multipart/form-data"

Güncelleme: type:"POST"Tüm dosyalar POST isteği ile gönderilmesi gerektiğinden bu istek seçenekler olmadan çalışamaz .

Not: contentType: false sadece jQuery 1.6 ve sonrasında mevcuttur


1
Ajax çağrısında "şifreleme" ayarlayabilir miyim? Sanırım onunla bir sorunum olabilir. Veya bunu FormData nesnesinde ayarlayabilir miyim?
Wouter

Yapabilirsin. Bunun için kodumda DOSYA YÜKLENMESİ İÇİN BU YAPILMASI gereken satırlara bakın.
Büyü

1
@Spell Veriyi denetleyiciye nasıl alabilirim? Göndermeye mi ihtiyacınız var getCsrfToken?
Юрий Светлов

@ ЮрийСветлов Bu, ne tür bir kontrol cihazı kullandığınıza bağlıdır. Sunucu tarafı veya ön taraf denetleyicisi mi? Burada CSRF korumasını çözmeye mi çalışıyorsunuz?
Yazım

1
@ManthanJamdagni Aldığınızda $('form'), jQuery nesnesi dönecektir. Ancak burada jQuery işlevselliği olmadan düzenli js nesnesine ihtiyacımız var. Bu yüzden [0]gösterimle düzenli bir nesne elde ederiz . Bu yapı yerine arayabilir document.getElementById()veya simüler çağrı yapabilirsiniz.
Yazım

37

Yeterli itibarım olmadığı için yukarıdaki bir yorum ekleyemem, ancak yukarıdaki cevap benim için neredeyse mükemmeldi, ancak eklemek zorunda kaldım

tür: "POST"

.ajax çağrısına. Birkaç dakika boyunca başımı kaşıyordum, neyi yanlış yaptığımı anlamaya çalışıyordum, hepsi gerekli ve bir tedavi işe yarıyor. Yani bu tüm pasaj:

Yukarıdaki cevaba tam kredi, bu sadece küçük bir değişiklik. Bu, başka birinin sıkışıp kalması ve bariz olanı görememesi durumudur.

  $.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 dosya yükleme ile 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();
    }
});

kullanabilirsiniz.

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

veya

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

Her ikisi de işe yarayacak.


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
Bir cevapla birlikte bir açıklama sağlamak normalde iyi bir form olarak kabul edilir.
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

Aslında, belgeler jquery berbat durumda çok formatlı verileriXMLHttpRequest().send() göndermek için kullanabileceğinizi gösterir


0

Öğeyi id ile document.getElementById ("yourFormElementID") gibi bulmak için yerel javascript kullanmak daha iyidir .

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

-4

Günaydın.

Birden fazla görüntünün yüklenmesi ile aynı sorunu yaşadım. Çözüm hayal ettiğimden daha basitti: isim alanına [] ekleyin.

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

FormData üzerinde herhangi bir değişiklik yapmadım.


Bunun, sorunun sorduğu sorunla bir ilgisi yoktur ve PHP'nin aynı ada sahip birden çok değer içeren verileri nasıl ele aldığının bir özelliğidir.
Quentin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.