使用jQuery.ajax发送multipart / formdata

限于喜欢 提交于 2020-02-28 09:33:51

我在使用jQuery的ajax函数将文件发送到服务器端PHP脚本时遇到问题。 可以使用$('#fileinput').attr('files')获取文件列表,但如何将这些数据发送到服务器呢? 使用文件输入时,服务器端php脚本上的结果数组( $_POST )为0( NULL )。

我知道这是有可能的(尽管直到现在我还没有找到任何jQuery解决方案,只有Prototye代码( 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);
    }
});

#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的解决方案。

Mozilla Dev 在处理FormData对象方面有一个不错的页面。

因此,在页面的某处添加一个空表单,指定enctype:

<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();
  } );
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!