【问题标题】:PHP AJAX Image Uploading with FormData使用 FormData 上传 PHP AJAX 图像
【发布时间】:2015-04-23 01:32:30
【问题描述】:

我对 jQuery 和 Ajax 函数比较陌生,但过去几天一直在使用 Ajax 表单。但是在尝试上传图像时,我遇到了文件上传问题。在寻找资源时,我找不到任何有用的东西,因为它们似乎过于复杂,带有毫无意义的附加功能或没有任何解释,这无助于我进一步学习。

我已经编写了这段代码来处理 Ajax 中的图像上传:

$(function() {
    $('.input_photo').on("change",function() {                              
        var formData = new FormData($('form.upload-form'));

        $.ajax({
            url: "upload.php",
            type: "POST",
            data: formData,
            success: function (msg) {
                alert(msg)
            }
        });
    });
});

这向upload.php文件发送了一个请求,但是没有发送任何数据,基本上我的表单是这样的:

<form class="upload-form">
     <input type="file" name="input_photo" class="input_photo" />
</form>

标题中似乎没有传递任何数据,我假设我会通过 PHP 使用 $_POST['data'] 数组或 $_FILES 访问它?请有更好知识的人帮助解释这一点,进一步理解这一点会很棒。 谢谢。

【问题讨论】:

    标签: php jquery ajax file-upload


    【解决方案1】:

    这适用于一个或多个文件。

    $('input:file').on('change', function () {  
    
     var data = new FormData();
    
     //Append files infos
     jQuery.each($(this)[0].files, function(i, file) {
         data.append('file-'+i, file);
     });
    
     $.ajax({  
         url: "my_path",  
         type: "POST",  
         data: data,  
         cache: false,
         processData: false,  
         contentType: false, 
         context: this,
         success: function (msg) {
              alert(msg);
          }
      });
    });
    

    然后

    $_FILES['file-0']
    $_FILES['file-1']
    [...]
    

    但要小心using FormData doesn't work on IE before IE10

    【讨论】:

    • 第一次完美运行,虽然我将其更改为 .on('change') 因为 live 已被弃用。非常感谢。
    【解决方案2】:

    试试这个:

    var formData = $('form.upload-form').serialize();
    

    【讨论】:

    • 只发布表单数据,不发布文件数据。
    【解决方案3】:

    您需要在您的 ajax 调用中设置 processDatacontentType(还为您的 input 元素添加了 id 以获取文件内容)。

    HTML

        <form class="upload-form">
             <input type="file" id="photo" name="input_photo" class="input_photo" /> 
        </form>
    

    JS

      $(function() {
            $('.input_photo').on("change",function() {    
                var file = document.getElementById("photo").files[0]; //fetch file
                var formData = new FormData();                     
                formData.append('file', file); //append file to formData object
    
                $.ajax({
                    url: "upload.php",
                    type: "POST",
                    data: formData,
                    processData: false, //prevent jQuery from converting your FormData into a string
                    contentType: false, //jQuery does not add a Content-Type header for you
                    success: function (msg) {
                        alert(msg)
                    }
                });
            });
        });
    

    【讨论】:

    • 刚刚从另一个问题中尝试了这个确切的代码,但由于某种原因它只是传递了一个空的 $_FILES 数组。
    猜你喜欢
    • 2017-05-25
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-24
    相关资源
    最近更新 更多