如何使用FormData进行ajax文件上传

Kal*_*pit 196 php ajax jquery

这是我使用拖放功能动态生成的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> 
Run Code Online (Sandbox Code Playgroud)

这是我的js代码......

<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); 
            }
        });
   }
Run Code Online (Sandbox Code Playgroud)

Spe*_*ell 415

要获得正确的表单数据使用,您需要执行两个步骤.

准备工作

您可以将整个表单提供给FormData()进行处理

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

或指定FormData()的确切数据

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

发送表格

使用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
});
Run Code Online (Sandbox Code Playgroud)

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

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

注意: contentType: false仅从jQuery 1.6开始提供

  • 我可以在 Ajax 调用中设置“enctype”吗?我想我可能有问题。或者,我可以在 FormData 对象上设置它吗? (2认同)
  • @Spell 如何获取控制器中的数据?是否需要发送`getCsrfToken`? (2认同)
  • @ManthanJamdagni 当你得到 `$('form')` 时,它会返回 jQuery 对象。但是我们在这里需要没有 jQuery 功能的常规 js 对象。这就是为什么我们得到带有‘[0]’符号的常规对象。您可以调用`document.getElementById()` 或模拟调用来代替这种构造。 (2认同)

小智 34

我不能在上面添加评论,因为我没有足够的声誉,但上面的答案对我来说几乎是完美的,除了我必须添加

类型:"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
})
Run Code Online (Sandbox Code Playgroud)


cha*_*doo 20

<form id="upload_form" enctype="multipart/form-data">
Run Code Online (Sandbox Code Playgroud)

带有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();
    }
});
Run Code Online (Sandbox Code Playgroud)

您可以使用.

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

要么

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

两者都有效.

  • 如果我们获取带有 id 的 dom,为什么我们需要像 $(#formId)[0] 这样输入 0 零? (2认同)

小智 6

$(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();
            },
        });
    });
});
Run Code Online (Sandbox Code Playgroud)