【问题标题】:How to use FormData for AJAX file upload?如何使用 FormData 进行 AJAX 文件上传?
【发布时间】:2014-01-29 10:54:38
【问题描述】:

这是我使用拖放功能动态生成的 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); 
            }
        });
   }

【问题讨论】:

标签: javascript jquery ajax file-upload


【解决方案1】:

要正确使用表单数据,您需要执行 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
});

在此之后它将发送 ajax 请求,就像您使用 enctype="multipart/form-data" 提交常规表单一样

更新:如果没有 type:"POST" 选项,此请求将无法工作,因为所有文件都必须通过 POST 请求发送。

注意: contentType: false 仅适用于 from jQuery 1.6 onwards

【讨论】:

  • 我可以在 Ajax 调用中设置“enctype”吗?我想我可能对此有问题。或者,我可以在 FormData 对象上设置它吗?
  • 你可以。为此,请参阅我的代码中的 THIS MUST BE DONE FOR FILE UPLOADING 之后的行。
  • @Spell 如何在控制器中获取数据?需要发getCsrfToken吗?
  • @ЮрийСветлов 这取决于您使用的控制器类型。是服务器端还是前端控制器?您想在这里解决 CSRF 保护问题?
  • @ManthanJamdagni 当你得到$('form')时,它会返回jQuery对象。但是我们需要没有 jQuery 功能的常规 js 对象。这就是为什么我们得到带有[0] 符号的常规对象。您可以调用document.getElementById() 或类似调用来代替这种构造。
【解决方案2】:

由于我没有足够的声誉,我无法在上面添加评论,但上面的答案对我来说几乎是完美的,除了我必须添加

类型:“POST”

到 .ajax 调用。我挠了几分钟,试图弄清楚我做错了什么,这就是它所需要的,而且很有效。这就是整个 sn-p:

完全归功于我上面的答案,这只是一个小小的调整。这是以防万一其他人被卡住而看不到明显的东西。

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

【讨论】:

    【解决方案3】:
    <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]); 
    

    两者都可以。

    【讨论】:

    • 如果我们得到带有 id 的 dom,为什么我们需要像 $(#formId)[0] 那样输入 0 零?
    【解决方案4】:
    $(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();
                },
            });
        });
    });
    

    【讨论】:

      【解决方案5】:
      $('#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");
                }
              }
          });
      
      
      
      }); 
      

      【讨论】:

        【解决方案6】:

        其实文档显示可以使用XMLHttpRequest().send() 简单地发送多格式数据 万一 jquery 很烂

        【讨论】:

          【解决方案7】:

          最好使用原生 javascript 按 id 查找元素,例如:document.getElementById("yourFormElementID")

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

          【讨论】:

            【解决方案8】:
            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】:

            早上好。

            我在上传多张图片时遇到了同样的问题。解决方案比我想象的要简单:在名称字段中包含 []。

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

            我没有对 FormData 进行任何修改。

            【讨论】:

            • 这与问题所问的问题无关,只是 PHP 如何处理具有多个同名值的表单数据的一个特点。
            猜你喜欢
            • 2018-03-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-04-04
            • 2014-08-09
            • 1970-01-01
            相关资源
            最近更新 更多