在我的代码中,有一个包含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);
?>
答案 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 = 0
,data: {0: [some binary of first image]}
j = 1
,data: {0: [some binary of second image]}
j = 2
,data: {0: [some binary of third image]}
请注意,密钥0
会不断被覆盖。
您应该编辑代码,以便:
$.each
。这是你混淆的根本原因 - 你混淆了这两个指数。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插件
喜欢
出于安全原因,您无法使用jquery ajax直接上传文件。所以最好使用一个包含更多选项和更多设施的插件