基于servlet的文件异步上传

基于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
< 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 >
上传页面
<% @ 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();" >
        
< href ="fileDownLoadServlet?filename=通讯录.xls" > 哈哈,测试文件下载 </ a >
    
</ body >
</ html >
需要注意的是:在使用ajaxFileUpload基于servlet上传时需要设置response.setContentType("text/html");尽管dataType: 'json'设置为json仍要设置response.setContentType("text/html");否则获取不到服务器端返回的数据以及会弹出一个对话框
这点与基于struts2的ajaxFileUpload上传是不一样的,可以参考之前写的 http://www.blogjava.net/sxyx2008/archive/2010/11/02/336826.html

你可能感兴趣的:(基于servlet的文件异步上传)