我在使用jQuery的ajax函数将文件发送到服务器端PHP脚本时遇到问题。 可使用$('#fileinput').attr('files')
获取文件列表,但如何将这些数据发送到服务器呢? 使用文件输入时,服务器端php脚本上的结果数组( $_POST
)为0( NULL
)。 php
我知道这是有可能的(尽管直到如今我尚未找到任何jQuery解决方案,只有Prototye代码( http://webreflection.blogspot.com/2009/03/safari-4-multiple-upload-with-progress.html )) )。 html
这彷佛是相对较新的,因此请不要说起经过XHR / Ajax没法上传文件,由于它确实能够正常工做。 jquery
我须要Safari 5,FF和Chrome中的功能会不错,但不是必需的。 web
我如今的代码是: ajax
$.ajax({ url: 'php/upload.php', data: $('#file').attr('files'), cache: false, contentType: 'multipart/form-data', processData: false, type: 'POST', success: function(data){ alert(data); } });
我只是根据阅读的一些信息构建了此功能。 数组
像使用.serialize()
同样使用它,而只需放入.serializefiles();
。
在个人测试中工做。
服务器
//USAGE: $("#form").serializefiles(); (function($) { $.fn.serializefiles = function() { var obj = $(this); /* ADD FILE TO PARAM AJAX */ var formData = new FormData(); $.each($(obj).find("input[type='file']"), function(i, tag) { $.each($(tag)[0].files, function(i, file) { formData.append(tag.name, file); }); }); var params = $(obj).serializeArray(); $.each(params, function (i, val) { formData.append(val.name, val.value); }); return formData; }; })(jQuery);
FormData类确实起做用,可是在iOS Safari(至少在iPhone上)中,我没法按原样使用Raphael Schweikert的解决方案。 app
Mozilla Dev 在处理FormData对象方面有一个不错的页面。 函数
所以,在页面的某处添加一个空表单,指定enctype: post
<form enctype="multipart/form-data" method="post" name="fileinfo" id="fileinfo"></form>
而后,将FormData对象建立为:
var data = new FormData($("#fileinfo"));
并按照Raphael的代码进行 。
若是您的表单是在HTML中定义的,则将表单传递给构造函数要比迭代和添加图像容易。
$('#my-form').submit( function(e) { e.preventDefault(); var data = new FormData(this); // <-- 'this' is your form element $.ajax({ url: '/my_URL/', data: data, cache: false, contentType: false, processData: false, type: 'POST', success: function(data){ ...
看个人代码,它对我有用
$( '#formId' ) .submit( function( e ) { $.ajax( { url: 'FormSubmitUrl', type: 'POST', data: new FormData( this ), processData: false, contentType: false } ); e.preventDefault(); } );