使用jQuery.ajax发送multipart / formdata

我在使用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);
    }
});

#1楼

我只是根据阅读的一些信息构建了此功能。 数组

像使用.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);

#2楼

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的代码进行


#3楼

  1. 经过jquery-> $(“#id”)[0]获取表单对象
  2. 数据=新的FormData($(“#id”)[0]);
  3. 好的,数据就是你想要的

#4楼

若是您的表单是在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){
            ...

#5楼

看个人代码,它对我有用

$( '#formId' )
  .submit( function( e ) {
    $.ajax( {
      url: 'FormSubmitUrl',
      type: 'POST',
      data: new FormData( this ),
      processData: false,
      contentType: false
    } );
    e.preventDefault();
  } );
相关文章
相关标签/搜索