使用FormData上传PHP AJAX图像

时间:2015-02-21 10:36:56

标签: php jquery ajax file-upload

我对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来访问它?有更好知识的人请帮助解释一下,进一步理解这一点会很棒。 感谢。

3 个答案:

答案 0 :(得分:9)

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

$('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

答案 1 :(得分:1)

您需要在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)
                }
            });
        });
    });

答案 2 :(得分:-2)

试试这个:

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