Làm cách nào để sử dụng FormData để tải lên tệp AJAX?


220

Đây là HTML của tôi mà tôi đang tạo động bằng cách sử dụng chức năng kéo và thả.

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

Đây là mã JavaScript của tôi:

<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
Bạn nên đọc cái này ( developer.mozilla.org/en-US/docs/Web/API/FormData/append ) formData();phương thức chắp thêm có một tham số thứ ba tùy chọn cho một tệp.
www139

Câu trả lời:


458

Để sử dụng dữ liệu biểu mẫu chính xác, bạn cần thực hiện 2 bước.

Chuẩn bị

Bạn có thể cung cấp toàn bộ biểu mẫu của mình cho FormData () để xử lý

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

hoặc chỉ định dữ liệu chính xác cho FormData ()

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

Gửi mẫu

Yêu cầu Ajax với jquery sẽ như thế này:

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

Sau đó, nó sẽ gửi yêu cầu ajax giống như bạn gửi biểu mẫu thông thường với enctype="multipart/form-data"

Cập nhật: Yêu cầu này không thể hoạt động mà không có type:"POST"trong các tùy chọn vì tất cả các tệp phải được gửi qua yêu cầu POST.

Lưu ý: contentType: false chỉ có sẵn từ jQuery 1.6 trở đi


1
Tôi có thể đặt "enctype" trong lệnh gọi Ajax không? Tôi nghĩ rằng tôi có thể có một vấn đề với nó. Hoặc, tôi có thể đặt nó trên đối tượng FormData không?
Wouter

Bạn có thể. Đối với điều này, hãy xem các dòng sau NÀY PHẢI ĐƯỢC LÀM CHO TÌM HIỂU TẢI LÊN trong mã của tôi.
vần

1
@Spell Làm thế nào để có được dữ liệu trong bộ điều khiển? Có cần gửi getCsrfTokenkhông?
Юрий Светлов

@ РийСвее Điều này phụ thuộc vào loại bộ điều khiển bạn sử dụng. Là máy chủ phía trước hoặc bộ điều khiển phía trước? Bạn đang cố gắng giải quyết bảo vệ CSRF ở đây?
vần

1
@ManthanJamdagni Khi bạn nhận được $('form'), nó sẽ trả về đối tượng jQuery. Nhưng chúng ta cần đối tượng js thường xuyên ở đây mà không có chức năng jQuery. Đó là lý do tại sao chúng ta có được đối tượng thường xuyên với [0]ký hiệu. Thay vì xây dựng này, bạn có thể gọi document.getElementById()hoặc gọi mô phỏng.
vần

37

Tôi không thể thêm nhận xét ở trên vì tôi không có đủ danh tiếng, nhưng câu trả lời ở trên gần như hoàn hảo đối với tôi, ngoại trừ tôi phải thêm

gõ: "BÀI"

đến cuộc gọi .ajax. Tôi đã gãi đầu trong vài phút để cố gắng tìm ra những gì tôi đã làm sai, đó là tất cả những gì nó cần và làm việc một điều trị. Vì vậy, đây là toàn bộ đoạn trích:

Tín dụng đầy đủ cho câu trả lời ở trên tôi, đây chỉ là một điều chỉnh nhỏ cho điều đó. Đây chỉ là trong trường hợp bất cứ ai khác bị mắc kẹt và không thể nhìn thấy rõ ràng.

  $.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">

jQuery với tệp tải lên CodeIgniter:

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();
    }
});

bạn có thể dùng.

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

hoặc là

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

Cả hai sẽ làm việc.


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
Nó thường được coi là hình thức tốt để cung cấp một lời giải thích cùng với một câu trả lời.
ngerak

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

Trên thực tế Tài liệu cho thấy rằng bạn có thể sử dụng XMLHttpRequest().send() để gửi dữ liệu đa dạng trong trường hợp jquery hút


0

Tốt hơn là sử dụng javascript gốc để tìm phần tử theo id như: document.getEuityById ("yourFormEuityID") .

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

-4

Buổi sáng tốt lành.

Tôi đã có cùng một vấn đề với việc tải lên nhiều hình ảnh. Giải pháp đơn giản hơn tôi tưởng: bao gồm [] trong trường tên.

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

Tôi đã không thực hiện bất kỳ sửa đổi nào trên FormData.


Điều này không liên quan gì đến vấn đề mà câu hỏi đang hỏi và chỉ là một đặc thù về cách PHP xử lý dữ liệu biểu mẫu với nhiều giá trị có cùng tên.
Quentin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.