【问题标题】:A FormData object is always empty when trying to upload a file using AJAX尝试使用 AJAX 上传文件时,FormData 对象始终为空
【发布时间】:2015-06-05 21:58:36
【问题描述】:

当尝试使用 AJAX 上传图像而不直接提交表单并将 FormData 对象发送到服务器时,它返回空 $_FILES 数组。但是如果我使用<input type="submit"> 标签$_FILES 提交表单,则数组不为空并接收数据。

HTML

<form action="core/update.php" method="post" enctype="multipart/form-data" id="profile-photo" name="profile-photo-form">
  <input type="file" id="photo-filename" name="avatar" class="edit-show panel photo-upload">
</form>
<button class="save-button" disabled="disabled">Save</button>

JS

$('#profile-photo').on('submit', function(e) {
    e.preventDefault();

    var form = $('#profile-photo')[0];
    var formData = new FormData(form);

    formData.append('avatar', $('#photo-filename')[0].files[0]);

    $.ajax({
      url: "core/update.php", 
      data: formData,
      type: "POST", 
      contentType: false,       
      cache: false,             
      processData: false
    });

    console.log(formData);
});

$('.save-button').on('click', function() {
    if ($('#photo-filename').val != '') {
        $('#profile-photo').submit();
    };
}

UPD

同样$('#profile-photo').serialize() 返回空白字符串。

UPD 2

它会与页面上的其他 AJAX 请求冲突吗?

【问题讨论】:

  • 为什么要添加两次文件输入?它已经在您使用 new FormData(form) 添加的表单中。
  • 以防万一。我尝试了很多添加数据的变体,但 FormData 是空的。
  • Musa,正在发送请求。请求负载:------WebKitFormBoundarykKBm9n5RL1SEIQD5 Content-Disposition: form-data; name="avatar"; filename="s369unD7-50[2].jpg" Content-Type: image/jpeg ------WebKitFormBoundarykKBm9n5RL1SEIQD5--
  • 找到解决方案了吗?

标签: php jquery html ajax


【解决方案1】:

试试这个:

因为用户可能会上传多个文件

jQuery.each(jQuery('#photo-filename')[0].files, function(i, file) {
    data.append('file-'+i, file);
});

代替

formData.append('avatar', $('#photo-filename')[0].files[0]);

完整的解决方案:

$('#profile-photo').on('submit', function(e) {
    e.preventDefault();

var form = $('#profile-photo')[0];
var formData = new FormData(form);

 jQuery.each(jQuery('#photo-filename')[0].files, function(i, file) {
    formData.append('file-'+i, file);
});

$.ajax({
  url: "core/update.php", 
  data: formData,
  type: "POST", 
  contentType: false,       
  cache: false,             
  processData: false
});

    console.log(formData);
});

【讨论】:

  • 我猜你的代码没有问题你可能正在检查update.php上的内容$_POST你必须使用$_FIELS
  • 不,我正在检查 $_FILES 数组,它返回 Array()
  • 这是写在你的update.php上吗if($_SERVER['REQUEST_METHOD'] == 'POST'){ echo "&lt;pre&gt;"; print_r($_FILES); }
  • 改成print_r($_FILES);
  • 这是我在第一条评论中提到的
【解决方案2】:

试试下面的,

$('#profile-photo').on('submit', function(e) {
    e.preventDefault();
    var formData = new FormData(this); // here I am editing

    formData.append('avatar', $('#photo-filename')[0].files[0]);

    $.ajax({
      url: "core/update.php", 
      data: formData,
      type: "POST", 
      contentType: false,       
      cache: false,             
      processData: false
    });

    console.log(formData);
});

【讨论】:

【解决方案3】:

如果只是您要发送的文件,那么您可以按照以下方式进行操作,无需在此处将表格附加到formdata

$('#profile-photo').on('submit', function(e) {
    e.preventDefault();
    var formdata = new FormData();
    var fileInput = $('#photo-filename');


    //Use Either this
    $.each($(fileInput).get(0).files, function (index, value) {
           formdata.append('avatar', value);
    });

    //Or this
    $.each($(fileInput).get(0).files, function (index, value) {
        formdata.append(value.name, value);
    });

    //For single file use this
    formData.append('avatar', $('#photo-filename')[0].files[0]);

    $.ajax({
      url: "core/update.php", 
      data: formData,
      type: "POST", 
      contentType: false,       
      cache: false,             
      processData: false
    });

    console.log(formData);
});

【讨论】:

  • 还是什么都没有。第一个解决方案和第二个解决方案都不是。
  • 你能告诉你submitingform吗??
  • 点击&lt;button class="save-button"&gt;&lt;/button&gt;对象会触发一个函数if ($('#photo-filename').val != '') { $('#profile-photo').submit(); };
  • 您可以编辑问题并将其插入问题中吗?整个过程??
猜你喜欢
  • 2015-06-04
  • 2020-05-22
  • 1970-01-01
  • 2016-07-23
  • 1970-01-01
  • 1970-01-01
  • 2013-06-27
  • 2021-02-26
  • 1970-01-01
相关资源
最近更新 更多