Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

【20161010】Ajax上传文件 #32

Closed
zhongxia245 opened this issue Oct 10, 2016 · 0 comments
Closed

【20161010】Ajax上传文件 #32

zhongxia245 opened this issue Oct 10, 2016 · 0 comments

Comments

@zhongxia245
Copy link
Owner

zhongxia245 commented Oct 10, 2016

Ajax使用FormData对象上传文件

FormData对象,是可以使用一系列的键值对来模拟一个完整的表单,然后使用XMLHttpRequest发送这个"表单"。

强烈推荐推荐看 这篇文章。

在 Mozilla Developer 网站 《使用FormData对象》 有详尽的FormData对象使用说明。

但上传文件部分只有底层的XMLHttpRequest对象发送上传请求,那么怎么通过jQuery的Ajax上传呢?

本文将介绍通过jQuery使用FormData对象上传文件。

使用 <form> 表单初始化FormData对象方式上传文件
HTML代码

<form id="uploadForm" enctype="multipart/form-data">
    <input id="file" type="file" name="file"/>
    <button id="upload" type="button">upload</button>
</form>

javascript代码

$.ajax({
    url: '/upload',
    type: 'POST',
    cache: false,
    data: new FormData($('#uploadForm')[0]),
    processData: false,  // 告诉jQuery不要去处理发送的数据
    contentType: false // 告诉jQuery不要去设置Content-Type请求头
}).done(function(res) {

}).fail(function(res) {

});

这里要注意几点:

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

如果不是用<form>表单构造FormData对象又该怎么做呢?

使用FormData对象添加字段方式上传文件
HTML代码

<div id="uploadForm">
    <input id="file" type="file"/>
    <button id="upload" type="button">upload</button>
</div>

这里没有<form>标签,也没有enctype="multipart/form-data"属性。

javascript代码

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 type="file">标签能够上传多个文件,
只需要在<input type="file">里添加multiple或multiple="multiple"属性。

兼容性

服务器端读文件

从Servlet 3.0 开始,可以通过 request.getPart()request.getPars()两个接口获取上传的文件。
这里不多说,详细请参考官网教程 Uploading Files with Java Servlet Technology 以及示例 The fileupload Example Application

参考

  1. https://developer.mozilla.org/zh-CN/docs/Web/Guide/Using_FormData_Objects
  2. http://stackoverflow.com/questions/10292382/html-5-formdata-and-java-servlets
  3. https://docs.oracle.com/javaee/7/tutorial/servlets011.htm#BABFGCHB
  4. https://docs.oracle.com/javaee/7/tutorial/servlets016.htm#BABDGFJJ
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant