【问题标题】:how to do file upload using jquery serialization如何使用jquery序列化进行文件上传
【发布时间】:2011-05-31 12:18:41
【问题描述】:

所以我有一个表单,我正在使用 jquery 序列化函数通过 ajax 提交表单

        serialized = $(Forms).serialize();

        $.ajax({

        type        : "POST",
        cache   : false,
        url     : "blah",
        data        : serialized,
        success: function(data) {

        }

但是如果表单有一个<input type="file"> 字段怎么办……如何使用这种 ajax 序列化方法将文件传递到表单中……打印 $_FILES 不会输出任何内容

【问题讨论】:

    标签: php jquery ajax serialization file-upload


    【解决方案1】:

    无法使用 AJAX 上传文件,因为您无法访问存储在客户端计算机上的文件内容并使用 javascript 在请求中发送该文件。实现此目的的技术之一是使用隐藏的 iframe。有一个很好的jquery form plugin,它允许你对你的表单进行AJAX化,它也可以supports file uploads。因此,使用此插件,您的代码将如下所示:

    $(function() {
        $('#ifoftheform').ajaxForm(function(result) {
            alert('the form was successfully processed');
        });
    });
    

    插件会自动处理订阅表单的submit 事件、取消默认提交、序列化值、使用正确的方法和处理文件上传字段,...

    【讨论】:

    • 这不再是真的。使用 和 FormData() 对象,可以非常简单地使用 AJAX 保存文件。请参阅下面 Silver89 的答案。
    • @Rook777,如果您使用的浏览器支持 HTML5 File API,那当然是正确的。你在IE中试过这个有多简单?在 HTML5 成为标准并被所有浏览器支持之前,将会有插件,因为您无法使用 AJAX 上传文件。
    • 你是对的。我很幸运处于一个不支持 IE 的开发环境中,所以我忘了考虑它。是的,如果没有 HTML5 兼容性,此功能将无法使用。据caniuse.com/xhr2称,目前只有IE 10+支持该功能。
    • jQuery 表单插件很棒!
    【解决方案2】:

    您可以使用 FormData 方法通过 AJAX 上传文件。虽然 IE7、8 和 9 不支持 FormData 功能。

    $.ajax({
        url: "ajax.php", 
        type: "POST",             
        data: new FormData('form'),
        contentType: false,       
        cache: false,             
        processData:false, 
        success: function(data) {
            $("#response").html(data);
        }
    });
    

    【讨论】:

    • new FormData('form') 中的 'form' 是什么,是 id,对我不起作用
    • 是的,这通常是表单 ID
    • 对我来说它只适用于 document.forms.form 而不是 'form' 字符串,传递给 FormData 构造函数
    【解决方案3】:

    使用FormData对象。它适用于任何类型的表单

    $(document).on("submit", "form", function(event)
    {
        event.preventDefault();
        $.ajax({
            url: $(this).attr("action"),
            type: $(this).attr("method"),
            dataType: "JSON",
            data: new FormData(this),
            processData: false,
            contentType: false,
            success: function (data, status)
            {
    
            },
            error: function (xhr, desc, err)
            {
                
    
            }
        });        
    
    });
    

    【讨论】:

    • 对此的重要说明:processData: false, contentType: false, 是避免Illegal invocation 错误所必需的,因为没有这些,jQuery 将在发送表单数据时尝试将其转换为字符串,这在本文中是不需要的案例。
    【解决方案4】:

    HTML5 引入了FormData 类,可用于通过ajax 进行文件上传。

    FormData 支持从以下桌面浏览器版本开始。 IE 10+、Firefox 4.0+、Chrome 7+、Safari 5+、Opera 12+

    FormData - Mozilla.org

    【讨论】:

      【解决方案5】:
         var form = $('#job-request-form')[0];
              var formData = new FormData(form);
              event.preventDefault();
              $.ajax({
                  url: "/send_resume/", // the endpoint
                  type: "POST", // http method
                  processData: false,
                  contentType: false,
                  data: formData,
      

      它对我有用!只需将 processData 和 contentType 设置为 False。

      【讨论】:

        【解决方案6】:

        HTML

        <form name="my_form" id="my_form" accept-charset="multipart/form-data" onsubmit="return false">
            <input id="name" name="name" placeholder="Enter Name" type="text" value="">
            <textarea id="detail" name="detail" placeholder="Enter Detail"></textarea>
            <select name="gender" id="gender">
                <option value="male" selected="selected">Male</option>
                <option value="female">Female</option>
            </select>
            <input type="file" id="my_images" name="my_images" multiple="" accept="image/x-png,image/gif,image/jpeg"/>
        </form>
        

        JavaScript

        var data = new FormData();
        
        //Form data
        var form_data = $('#my_form').serializeArray();
        $.each(form_data, function (key, input) {
            data.append(input.name, input.value);
        });
        
        //File data
        var file_data = $('input[name="my_images"]')[0].files;
        for (var i = 0; i < file_data.length; i++) {
            data.append("my_images[]", file_data[i]);
        }
        
        //Custom data
        data.append('key', 'value');
        
        $.ajax({
            url: "URL",
            method: "post",
            processData: false,
            contentType: false,
            data: data,
            success: function (data) {
                //success
            },
            error: function (e) {
                //error
            }
        });
        

        PHP

        <?php
            echo '<pre>';
            print_r($_POST);
            print_r($_FILES);
            echo '</pre>';
            die();
        ?>
        

        【讨论】:

        • 如何发送提交按钮名称?
        • @MuhammadTarique 您只需添加像 &lt;button type="button" name="button_name" value="Contact Button"&gt;Submit&lt;/button&gt; 这样的按钮,然后在 php 端得到响应 button_name = "Contact Button"
        • 感谢您的回复,但我认为它不会以这种方式工作。但是我已经使用formData.append("btnName", "true"); 完成了这项工作
        • @MuhammadTarique 这个例子已经添加到这篇文章中,比如data.append('key', 'value');
        【解决方案7】:
        $(document).on('click', '#submitBtn', function(e){
        e.preventDefault();
        e.stopImmediatePropagation();
        var form = $("#myForm").closest("form");
        var formData = new FormData(form[0]);
        $.ajax({
            type: "POST",
            data: formData,
            dataType: "json",
            url: form.attr('action'),
            processData: false,
            contentType: false,
            success: function(data) {
                 alert('Sucess! Form data posted with file type of input also!');
            }
        )};});
        

        通过使用new FormData() 和设置processData: false, contentType:false 在ajax 调用提交表单和文件输入为我工作

        使用上面的代码,我也可以通过 Ajax 提交带有文件字段的表单数据

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-09
          • 2010-10-08
          • 2010-12-31
          相关资源
          最近更新 更多