我有一个问题发送文件到服务器端php脚本使用jQuery的ajax函数。
这是有可能得到文件列表与$('#fileinput').attr('文件'),但如何可能将此数据发送到服务器?当使用文件输入时,服务器端php-script上的结果数组($_POST)为0 (NULL)。
我知道这是可能的(尽管到目前为止我还没有找到任何jQuery解决方案,只有prototyye代码(http://webreflection.blogspot.com/2009/03/safari-4-multiple-upload-with-progress.html))。
这似乎是相对较新的,所以请不要提到文件上传将不可能通过XHR/Ajax,因为它肯定是工作的。
我需要的功能在Safari 5, FF和Chrome会很好,但不是必要的。
我现在的代码是:
$.ajax({
url: 'php/upload.php',
data: $('#file').attr('files'),
cache: false,
contentType: 'multipart/form-data',
processData: false,
type: 'POST',
success: function(data){
alert(data);
}
});
Devin Venable的回答接近于我想要的,但我想要一个可以在多个表单上工作的答案,并使用表单中已经指定的操作,以便每个文件都能到达正确的位置。
我还想使用jQuery的on()方法,这样我就可以避免使用.ready()。
这让我想到了这个:
(用jQuery选择器替换formSelector)
$(document).on('submit', formSelecter, function( e ) {
e.preventDefault();
$.ajax( {
url: $(this).attr('action'),
type: 'POST',
data: new FormData( this ),
processData: false,
contentType: false
}).done(function( data ) {
//do stuff with the data you got back.
});
});
FormData类确实可以工作,但在iOS Safari(至少在iPhone上)我不能使用Raphael Schweikert的解决方案。
Mozilla Dev有一个关于操纵FormData对象的不错的页面。
因此,在页面的某个地方添加一个空表单,指定enctype:
<form enctype="multipart/form-data" method="post" name="fileinfo" id="fileinfo"></form>
然后,创建FormData对象如下:
var data = new FormData($("#fileinfo"));
就像拉斐尔的密码一样