基于servlet的文件异步上传
package
com.future.zfs.util;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
@SuppressWarnings( " serial " )
public class FileUploadServlet extends HttpServlet {
final long MAX_SIZE = 10 * 1024 * 1024 ; // 设置上传文件最大为 10M
// 允许上传的文件格式的列表
final String[] allowtype = new String[] { " jpg " , " jpeg " , " gif " , " txt " , " doc " , " docx " , " mp3 " , " wma " , " m4a " , " xls " };
public FileUploadServlet() {
super ();
}
public void destroy() {
super .destroy();
}
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType( " text/html " );
// 设置字符编码为UTF-8, 这样支持汉字显示
response.setCharacterEncoding( " UTF-8 " );
// 实例化一个硬盘文件工厂,用来配置上传组件ServletFileUpload
DiskFileItemFactory dfif = new DiskFileItemFactory();
dfif.setSizeThreshold( 4096 ); // 设置上传文件时用于临时存放文件的内存大小,这里是4K.多于的部分将临时存在硬盘
dfif.setRepository( new File(request.getRealPath( " / " )
+ " uploadtemp " )); // 设置存放临时文件的目录,web根目录下的uploadtemp目录
// 用以上工厂实例化上传组件
ServletFileUpload sfu = new ServletFileUpload(dfif);
// 设置最大上传尺寸
sfu.setSizeMax(MAX_SIZE);
PrintWriter out = response.getWriter();
// 从request得到 所有 上传域的列表
List fileList = null ;
try {
fileList = sfu.parseRequest(request);
} catch (FileUploadException e) { // 处理文件尺寸过大异常
if (e instanceof SizeLimitExceededException) {
out.println( " {message:'文件尺寸超过规定大小: " + MAX_SIZE + " 字节'} " );
return ;
}
e.printStackTrace();
}
// 没有文件上传
if (fileList == null || fileList.size() == 0 ) {
out.println( " {message:'请选择上传文件'} " );
return ;
}
// 得到所有上传的文件
Iterator fileItr = fileList.iterator();
// 循环处理所有文件
while (fileItr.hasNext()) {
FileItem fileItem = null ;
String path = null ;
long size = 0 ;
// 得到当前文件
fileItem = (FileItem) fileItr.next();
// 忽略简单form字段而不是上传域的文件域(<input type="text" />等)
if (fileItem == null || fileItem.isFormField()) {
continue ;
}
// 得到文件的完整路径
path = fileItem.getName();
// 得到文件的大小
size = fileItem.getSize();
if ( "" .equals(path) || size == 0 ) {
out.println( " {message:'请选择上传文件'} " );
return ;
}
// 得到去除路径的文件名
String t_name = path.substring(path.lastIndexOf( " \\ " ) + 1 );
// 得到文件的扩展名(无扩展名时将得到全名)
String t_ext = t_name.substring(t_name.lastIndexOf( " . " ) + 1 );
// 拒绝接受规定文件格式之外的文件类型
int allowFlag = 0 ;
int allowedExtCount = allowtype.length;
for (; allowFlag < allowedExtCount; allowFlag ++ ) {
if (allowtype[allowFlag].equals(t_ext))
break ;
}
if (allowFlag == allowedExtCount) {
String message = "" ;
for (allowFlag = 0 ; allowFlag < allowedExtCount; allowFlag ++ ){
message += " *. " + allowtype[allowFlag]
+ " " ;
}
out.println( " {message:'请上传以下类型的文件 " + message + " '} " );
return ;
}
long now = System.currentTimeMillis();
// 根据系统时间生成上传后保存的文件名
String prefix = String.valueOf(now);
// 保存的最终文件完整路径,保存在web根目录下的upload目录下
String u_name = request.getRealPath( " / " ) + " upload/ "
+ prefix + " . " + t_ext;
// 原来的文件名
path = request.getRealPath( " / " ) + " upload/ " + path;
try {
// 保存文件
fileItem.write( new File(path));
response.setStatus( 200 );
out.println( " {message:\ " 文件上传成功. 已保存为: " + prefix + " . " + t_ext
+ " 文件大小: " + size + " 字节\ " } " );
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
web.xml
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
@SuppressWarnings( " serial " )
public class FileUploadServlet extends HttpServlet {
final long MAX_SIZE = 10 * 1024 * 1024 ; // 设置上传文件最大为 10M
// 允许上传的文件格式的列表
final String[] allowtype = new String[] { " jpg " , " jpeg " , " gif " , " txt " , " doc " , " docx " , " mp3 " , " wma " , " m4a " , " xls " };
public FileUploadServlet() {
super ();
}
public void destroy() {
super .destroy();
}
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType( " text/html " );
// 设置字符编码为UTF-8, 这样支持汉字显示
response.setCharacterEncoding( " UTF-8 " );
// 实例化一个硬盘文件工厂,用来配置上传组件ServletFileUpload
DiskFileItemFactory dfif = new DiskFileItemFactory();
dfif.setSizeThreshold( 4096 ); // 设置上传文件时用于临时存放文件的内存大小,这里是4K.多于的部分将临时存在硬盘
dfif.setRepository( new File(request.getRealPath( " / " )
+ " uploadtemp " )); // 设置存放临时文件的目录,web根目录下的uploadtemp目录
// 用以上工厂实例化上传组件
ServletFileUpload sfu = new ServletFileUpload(dfif);
// 设置最大上传尺寸
sfu.setSizeMax(MAX_SIZE);
PrintWriter out = response.getWriter();
// 从request得到 所有 上传域的列表
List fileList = null ;
try {
fileList = sfu.parseRequest(request);
} catch (FileUploadException e) { // 处理文件尺寸过大异常
if (e instanceof SizeLimitExceededException) {
out.println( " {message:'文件尺寸超过规定大小: " + MAX_SIZE + " 字节'} " );
return ;
}
e.printStackTrace();
}
// 没有文件上传
if (fileList == null || fileList.size() == 0 ) {
out.println( " {message:'请选择上传文件'} " );
return ;
}
// 得到所有上传的文件
Iterator fileItr = fileList.iterator();
// 循环处理所有文件
while (fileItr.hasNext()) {
FileItem fileItem = null ;
String path = null ;
long size = 0 ;
// 得到当前文件
fileItem = (FileItem) fileItr.next();
// 忽略简单form字段而不是上传域的文件域(<input type="text" />等)
if (fileItem == null || fileItem.isFormField()) {
continue ;
}
// 得到文件的完整路径
path = fileItem.getName();
// 得到文件的大小
size = fileItem.getSize();
if ( "" .equals(path) || size == 0 ) {
out.println( " {message:'请选择上传文件'} " );
return ;
}
// 得到去除路径的文件名
String t_name = path.substring(path.lastIndexOf( " \\ " ) + 1 );
// 得到文件的扩展名(无扩展名时将得到全名)
String t_ext = t_name.substring(t_name.lastIndexOf( " . " ) + 1 );
// 拒绝接受规定文件格式之外的文件类型
int allowFlag = 0 ;
int allowedExtCount = allowtype.length;
for (; allowFlag < allowedExtCount; allowFlag ++ ) {
if (allowtype[allowFlag].equals(t_ext))
break ;
}
if (allowFlag == allowedExtCount) {
String message = "" ;
for (allowFlag = 0 ; allowFlag < allowedExtCount; allowFlag ++ ){
message += " *. " + allowtype[allowFlag]
+ " " ;
}
out.println( " {message:'请上传以下类型的文件 " + message + " '} " );
return ;
}
long now = System.currentTimeMillis();
// 根据系统时间生成上传后保存的文件名
String prefix = String.valueOf(now);
// 保存的最终文件完整路径,保存在web根目录下的upload目录下
String u_name = request.getRealPath( " / " ) + " upload/ "
+ prefix + " . " + t_ext;
// 原来的文件名
path = request.getRealPath( " / " ) + " upload/ " + path;
try {
// 保存文件
fileItem.write( new File(path));
response.setStatus( 200 );
out.println( " {message:\ " 文件上传成功. 已保存为: " + prefix + " . " + t_ext
+ " 文件大小: " + size + " 字节\ " } " );
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
<
servlet
>
< servlet-name > fileUploadServlet </ servlet-name >
< servlet-class > com.future.zfs.util.FileUploadServlet </ servlet-class >
</ servlet >
< servlet-mapping >
< servlet-name > fileUploadServlet </ servlet-name >
< url-pattern > /fileUploadServlet </ url-pattern >
</ servlet-mapping >
上传页面
< servlet-name > fileUploadServlet </ servlet-name >
< servlet-class > com.future.zfs.util.FileUploadServlet </ servlet-class >
</ servlet >
< servlet-mapping >
< servlet-name > fileUploadServlet </ servlet-name >
< url-pattern > /fileUploadServlet </ url-pattern >
</ servlet-mapping >
<%
@ page language
=
"
java
"
contentType
=
"
text/html; charset=UTF-8
"
pageEncoding = " UTF-8 " %>
<! DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" >
< html >
< head >
< meta http-equiv ="Content-Type" content ="text/html; charset=UTF-8" >
< title > Insert title here </ title >
< script type ="text/javascript" src ="js/jquery.js" ></ script >
< script type ="text/javascript" src ="js/ajaxfileupload.js" ></ script >
< script type ="text/javascript" >
function ajaxFileUpload()
{
$( " #loading " )
.ajaxStart( function (){
$( this ).show();
}) // 开始上传文件时显示一个图片
.ajaxComplete( function (){
$( this ).hide();
}); // 文件上传完成将图片隐藏起来
$.ajaxFileUpload
(
{
url:'fileUploadServlet', // 用于文件上传的服务器端请求地址
secureuri: false , // 一般设置为false
fileElementId:'file', // 文件上传空间的id属性 <input type="file" id="file" name="file" />
dataType: 'json', // 返回值类型 一般设置为json
success: function (data, status) // 服务器成功响应处理函数
{
// alert(data.message);//从服务器返回的json中取出message中的数据,其中message为在struts2中定义的成员变量
$('#myspan').html(data.message);
if ( typeof (data.error) != 'undefined')
{
if (data.error != '')
{
// alert(data.error);
$('#myspan').html(data.message);
} else
{
// alert(data.message);
$('#myspan').html(data.message);
}
}
},
error: function (data, status, e) // 服务器响应失败处理函数
{
// alert(e);
$('#myspan').html(e);
}
}
)
return false ;
}
</ script >
</ head >
< body >
< img src ="images/loading.gif" id ="loading" style ="display: none;" >
< span style ="color: red;" id ="myspan" ></ span >< br />
< input type ="file" id ="file" name ="file" />
< br />
< input type ="button" value ="上传" onclick ="return ajaxFileUpload();" >
< a href ="fileDownLoadServlet?filename=通讯录.xls" > 哈哈,测试文件下载 </ a >
</ body >
</ html >
需要注意的是:在使用ajaxFileUpload基于servlet上传时需要设置response.setContentType("text/html");尽管dataType: 'json'设置为json仍要设置response.setContentType("text/html");否则获取不到服务器端返回的数据以及会弹出一个对话框
pageEncoding = " UTF-8 " %>
<! DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" >
< html >
< head >
< meta http-equiv ="Content-Type" content ="text/html; charset=UTF-8" >
< title > Insert title here </ title >
< script type ="text/javascript" src ="js/jquery.js" ></ script >
< script type ="text/javascript" src ="js/ajaxfileupload.js" ></ script >
< script type ="text/javascript" >
function ajaxFileUpload()
{
$( " #loading " )
.ajaxStart( function (){
$( this ).show();
}) // 开始上传文件时显示一个图片
.ajaxComplete( function (){
$( this ).hide();
}); // 文件上传完成将图片隐藏起来
$.ajaxFileUpload
(
{
url:'fileUploadServlet', // 用于文件上传的服务器端请求地址
secureuri: false , // 一般设置为false
fileElementId:'file', // 文件上传空间的id属性 <input type="file" id="file" name="file" />
dataType: 'json', // 返回值类型 一般设置为json
success: function (data, status) // 服务器成功响应处理函数
{
// alert(data.message);//从服务器返回的json中取出message中的数据,其中message为在struts2中定义的成员变量
$('#myspan').html(data.message);
if ( typeof (data.error) != 'undefined')
{
if (data.error != '')
{
// alert(data.error);
$('#myspan').html(data.message);
} else
{
// alert(data.message);
$('#myspan').html(data.message);
}
}
},
error: function (data, status, e) // 服务器响应失败处理函数
{
// alert(e);
$('#myspan').html(e);
}
}
)
return false ;
}
</ script >
</ head >
< body >
< img src ="images/loading.gif" id ="loading" style ="display: none;" >
< span style ="color: red;" id ="myspan" ></ span >< br />
< input type ="file" id ="file" name ="file" />
< br />
< input type ="button" value ="上传" onclick ="return ajaxFileUpload();" >
< a href ="fileDownLoadServlet?filename=通讯录.xls" > 哈哈,测试文件下载 </ a >
</ body >
</ html >
这点与基于struts2的ajaxFileUpload上传是不一样的,可以参考之前写的 http://www.blogjava.net/sxyx2008/archive/2010/11/02/336826.html