使用jQuery Ajax使用FormData对象上传文件

通过jQuery Ajax使用FormData对象上传文件

FormData对象用以将数据编译成键值对,以便用XMLHttpRequest来发送数据。其主要用于发送表单数据,但亦可用于发送带键数据(keyed data),而独立于表单使用。如果表单enctype属性设为multipart/form-data ,则会使用表单的submit()方法来发送数据,从而,发送数据具有同样形式。

你可以自己创建一个FormData对象,然后调用它的append()方法来添加字段,像这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var formData = new FormData();

formData.append("username", "Groucho");
formData.append("accountnum", 123456); //数字123456会被立即转换成字符串 "123456"

// HTML 文件类型input,由用户选择
formData.append("userfile", fileInputElement.files[0]);

// JavaScript file-like 对象
var content = '<a id="a"><b id="b">hey!</b></a>'; // 新文件的正文...
var blob = new Blob([content], { type: "text/xml"});

formData.append("webmasterfile", blob);

var request = new XMLHttpRequest();
request.open("POST", "http://foo.com/submitform.php");
request.send(formData);

参考文档—FormData

通过jQuery使用FormData对象上传文件

  • 方法一
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<form id="uploadForm" enctype="multipart/form-data">
<input id="file" type="file" name="file"/>
<button id="upload" type="button">upload</button>
</form>

$.ajax({
url: '/upload',
type: 'POST',
cache: false,
data: new FormData($('#uploadForm')[0]),
processData: false,
contentType: false
}).done(function(res) {
}).fail(function(res) {});

这里要注意几点:

  • processData设置为false。因为data值是FormData对象,不需要对数据做处理。
  • 标签添加enctype=”multipart/form-data”属性。
  • cache设置为false,上传文件不需要缓存。
  • contentType设置为false。因为是由
    表单构造的FormData对象,且已经声明了属性enctype=”multipart/form-data”,所以这里设置为false。
  • 上传后,服务器端代码需要使用从查询参数名为file获取文件输入流对象,因为input中声明的是name=”file”。

  • 方法二

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<div id="uploadForm">
<input id="file" type="file"/>
<button id="upload" type="button">upload</button>
</div>

var formData = new FormData();
formData.append('file', $('#file')[0].files[0]);
$.ajax({
url: '/upload',
type: 'POST',
cache: false,
data: formData,
processData: false,
contentType: false
}).done(function(res) {
}).fail(function(res) {});

这里有几处不一样:

  • append()的第二个参数应是文件对象,即$(‘#file’)[0].files[0]。
  • contentType也要设置为false。
  • 从代码$(‘#file’)[0].files[0]中可以看到一个input标签能够上传多个文件,只需要在input里添加multiple或multiple=”multiple”属性。
-------------已经触及底线 感谢您的阅读-------------

本文标题:使用jQuery Ajax使用FormData对象上传文件

文章作者:趙小傑~~

发布时间:2019年08月21日 - 12:02:13

最后更新:2019年08月24日 - 00:17:52

原始链接:https://cnsyear.com/posts/d0c3b262.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%