如何使用jQuery.ajax和FormData上传文件

Har*_*rts 58 javascript ajax jquery file-upload xmlhttprequest

当我使用XMLHttpRequest时,使用正确上传文件FormData.但是,当我切换到时jQuery.ajax,我的代码中断了.

这是工作原始代码:

function uploadFile(blobFile, fileName) {
    var fd = new FormData();
    fd.append("fileToUpload", blobFile);
    var xhr = new XMLHttpRequest();
    xhr.open("POST", "upload.php", true);
    xhr.send(fd);
}
Run Code Online (Sandbox Code Playgroud)

这是我不成功的jQuery.ajax尝试:

function uploadFile(blobFile, fileName) {
    var fd = new FormData();
    fd.append("fileToUpload", blobFile);
    var xm = $.ajax({
        url: "upload.php",
        type: "POST",
        data: fd,
    });
}
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?如何使用AJAX正确上传文件?

Rob*_*b W 167

您必须添加processData:false,contentType:false到您的方法,以便jQuery不会更改标头或数据(这会破坏您当前的代码).

function uploadFile(blobFile, fileName) {
    var fd = new FormData();
    fd.append("fileToUpload", blobFile);

    $.ajax({
       url: "upload.php",
       type: "POST",
       data: fd,
       processData: false,
       contentType: false,
       success: function(response) {
           // .. do something
       },
       error: function(jqXHR, textStatus, errorMessage) {
           console.log(errorMessage); // Optional
       }
    });
}  
Run Code Online (Sandbox Code Playgroud)

  • @tmyie这是一个[`Blob`](https://developer.mozilla.org/en-US/docs/Web/API/Blob)或[`File`](https://developer.mozilla.org/ en-US/docs/Web/API/File)对象,例如对于`<input type ="file"id ="filechooser">`它是`document.getElementById('filechooser').files [0]`(提供用户选择了一个文件).(在jQuery中,`$('#filechooser')[0] .files [0]`) (10认同)
  • 如果可以的话,我会对此进行1000次投票.在关于SO的这个问题的所有其他答案中,这个问题是最好的,也是最简单的.谢谢. (7认同)
  • 警告:在版本10之前,IE不支持FormData. (6认同)
  • 在这个答案(和问题)中,什么是`blobFile`?它是input.val()吗? (6认同)
  • @MarceloBarbosa`fd.append('field_name','string_field_value');` - 请参阅https://developer.mozilla.org/en-US/docs/Web/API/FormData (3认同)