使用ajax和jquery上传多个文件

时间:2015-06-19 07:07:37

标签: php jquery html

在我的代码中,有一个包含2个输入元素的表单:

文字输入

文件输入(包含图片)。

我在点击按钮时附加每个文件输入 并希望在ajax调用中上传所有图像, 但在我的PHP文件中,我只获得了文本输入的最终图像和值。

我的html和jquery代码如下:

HTML代码

<html>
    <body>
        <form name="ajax_image" id="ajax_image" method="post">
            <input type="text" name="project_name" id="project_name" placeholder="Project Name" /><br/><br/>
            <input type="text" name="project_duration" id="project_duration" placeholder="Project Duration" /><br/><br/>
            <div id="image_uploads">
            <input type="file" name="project_image[]" class="project_image" placeholder="Project Image" />
           <input type="button" name="add_upload" id="add_upload" value="+" />
            <br/><br/>
            </div>
            <input type="submit" name="submit"  id="submit" value="Submit" />
        </form>
    </body>
</html>

Jquery代码

<script>
    $(document).ready(function () {
       var count=0;
        $("#add_upload").click(function(){ 
            var input = '<input type="file" name="project_image[]" class="project_image" placeholder="Project Image"/><br/><br/>'
                $("#image_uploads").append(input); 
                count++;
            });

        $("#ajax_image").submit(function (event) {                  
            event.preventDefault();          
            var data = new FormData();    


                   for(var j=0 ; j<= count ; j++)
            {
               // alert(j);
            $.each($(".project_image")[j].files, function (i, file)
            {          
                data.append(i, file);
            });
            }            
            $.each($('#ajax_image').serializeArray(), function (i, obj) {
                data.append(obj.name, obj.value)
            });

            $.ajax({
                url: "http://localhost/hetal/multi_image_php_ajax.php",
                type: "POST",
                data: data,
                processData: false,
                contentType: false,
                success: function () {
                    alert('Form Submitted!');
                },
                error: function () {
                    alert("error in ajax form submission");
                }
            });
        });
    });

</script>

PHP文件

<?php
print_r($_POST);

print_r($_FILES);
?>

3 个答案:

答案 0 :(得分:2)

问题似乎出现在JS的这一部分:

 for(var j=0 ; j<= count ; j++) {
        // alert(j);
        $.each($(".project_image")[j].files, function (i, file)
        {          
            data.append(i, file);
        });
 }

假设有3个文件(count == 3)。您正在循环$.each三次呼叫。每次,您都会浏览文件project_image[j]并通过密钥FormData将其附加到i。由于每个project_image[j]只有一个j,因此i的值始终为0

您最终会遇到data这一系列事件:

  • j = 0data: {0: [some binary of first image]}
  • j = 1data: {0: [some binary of second image]}
  • j = 2data: {0: [some binary of third image]}

请注意,密钥0会不断被覆盖。

您应该编辑代码,以便:

  1. 显然,没有必要在循环中调用$.each。这是你混淆的根本原因 - 你混淆了这两个指数。
  2. 修复密钥名称,即引用正确的循环索引。简而言之,将i始终为0更改为j,这实际上是您想要的索引。

答案 1 :(得分:1)

文档准备好后,添加一个变量:

var fileCounter = 0;

将它传递给append方法的第一个参数,然后递增。

$.each($(".project_image")[j].files, function (i, file)
{          
     data.append(fileCounter, file);
     fileCounter++;
});

问题是您在POST请求中发送了两个具有相同名称的文件。您可以通过打开ajax请求并单击Firebug中的POST选项卡来查看此信息。两个文件都是这样的,所以每个下一个文件都会覆盖前一个文件:

Content-Disposition: form-data; name="0";

编辑:只需将j作为附加的第一个参数传递而不是杂乱,它就是一个更简单的解决方案:

for(var j=0 ; j<= count ; j++)
{
    $.each($(".project_image")[j].files, function (i, file)
    { 
         data.append(j, file);
     });
}

编辑2

也可以使用文件输入的multiple属性来完成。然后添加其他输入并不是必需的,只需将它们发送一次即可。

HTML:

<form name="ajax_image" id="ajax_image" method="post" enctype="multipart/form-data">
        <input type="text" name="project_name" id="project_name" placeholder="Project Name" /><br/><br/>
        <input type="text" name="project_duration" id="project_duration" placeholder="Project Duration" /><br/><br/>
        <input type="file" name="project_images" class="project_images" placeholder="Project Image" multiple /><br/><br/>
        <input type="submit" name="submit"  id="submit" value="Submit" />
    </form>

JS:

$(document).ready(function () {
    $("#ajax_image").submit(function (event) {
        var data = new FormData();

        event.preventDefault();

        $.each($(".project_images")[0].files, function (key, file){
            data.append(key, file);
        });  

        $.each($('#ajax_image').serializeArray(), function (i, obj) {
            data.append(obj.name, obj.value)
        });

        $.ajax({
            url: "upload.php",
            type: "POST",
            data: data,
            processData: false,
            contentType: false,
            success: function () {
                alert('Form Submitted!');
            },
            error: function () {
                alert("error in ajax form submission");
            }
         });
    });
});

答案 2 :(得分:0)

而不是创建您的代码。我建议你使用Jquery插件

喜欢

  

uploadify

     

Uploadifive

     

Jquery file upload

出于安全原因,您无法使用jquery ajax直接上传文件。所以最好使用一个包含更多选项和更多设施的插件

  • 它可以帮助您使用加载程序和进度条上传多个文件并预览