JSP实现任意个文件上传

使用commons-fileupload实现单个和多个文件上传

对于实现文件上传功能来说,Commons-fileupload组件是一个不错的选择,本文使用它实现了单个文件及多个文件上传,这里将实现过程写出来与大家共享。

1.单个文件上传。
页面代码:

       
....
< div  id ="content" >
            
< fieldset >< legend > 下載列表 </ legend >
                
< ul >
                
<%
                    List
< String >  downloadList = (List < String > )request.getAttribute( " downloadList " );    
                    
                    
if (downloadList! = null ){
                        
for ( String  str:downloadList){    
                            out.print(
" <li><a href='DownloadFile?file= " + str + " '> " + str + " </a></li> " );
                        }
                    }
                
%>
                
</ ul >
            
</ fieldset >
        
            
<!--  enctype属性为表单定义了MIME编码方式,上传文件的表单enctype属性必须如此设置  -->
            
< form  method ="post"  action ="UploadFile"  enctype ="multipart/form-data"   >
            
< p >< input  type ="text"  name ="fileIntro"  value =""   /> 文件介绍 </ p >
            
< p >< input  type ="file"  name ="myfile1"  value ="浏览文件"   /></ p >
            
< p >< input  type ="submit"  value ="上传" /></ p >
            
</ form >
        
</ div >....

在上传表单中,既有普通文本域也有文件上传域,注意在Servlet中取它们和平常的做法不同:
Servlet代码:

package  com.sitinspring.action;

import
 java.io.File;
import
 java.util.ArrayList;
import
 java.util.Iterator;
import
 java.util.List;

import
 javax.servlet.RequestDispatcher;
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.FileItemFactory;
import
 org.apache.commons.fileupload.disk.DiskFileItemFactory;
import
 org.apache.commons.fileupload.servlet.ServletFileUpload;

import
 com.sitinspring.util.UploadUtil;

/**

 * 用于文件上传处理的Servlet
 * 
@author  sitinspring
 *
 * @date 2008-2-12
 
*/

public class UploadFileServlet extends  HttpServlet {
    
private static final long serialVersionUID = 56890894234786L
;

    @SuppressWarnings(
"unchecked"
)
    
public void
 doPost(HttpServletRequest request, HttpServletResponse response)
            
throws
 ServletException, java.io.IOException {
        request.setCharacterEncoding(
"UTF-8"
);

        
// 文件上傳部分

        boolean isMultipart =  ServletFileUpload.isMultipartContent(request);
        
        
if (isMultipart == true
) {
            
try
 {
                FileItemFactory factory 
= new
 DiskFileItemFactory();
                ServletFileUpload upload 
= new
 ServletFileUpload(factory);
                
                
// 得到所有的表单域,它们目前都被当作FileItem

                List<FileItem> fileItems =  upload.parseRequest(request);
                Iterator
<FileItem> iter =
 fileItems.iterator();
                
                
// 依次处理每个表单域

                while  (iter.hasNext()) {
                    FileItem item 
=
 (FileItem) iter.next();
                    
                    
if
(item.isFormField()){
                        
// 如果item是正常的表单域

                        String name =  item.getFieldName();
                        String value 
=
 item.getString();
                        System.out.print(
"表单域名为:"+name+"表单域值为:"+
value);
                    }
                    
else
{
                        
//
 如果item是文件上传表单域
                        
                        
// 获得文件名及路径

                        String fileName =  item.getName();
                        
if (fileName != null
) {
                            File fullFile 
= new
 File(item.getName());                            
                                                        
                            
// 如果文件存在则上传

                            if (fullFile.exists()){
                                File fileOnServer 
= new
 File(UploadUtil.getUploadPath(),
                                        fullFile.getName());
                                item.write(fileOnServer);
                                
                                System.out.println(
"文件"+fileOnServer.getName()+"上传成功"
);
                            }
                        }
                    }
                }                
            } 
catch
 (Exception e) {
                e.printStackTrace();
            }
        } 
else
 {
            System.out.println(
"the enctype must be multipart/form-data"
);
        }
        
        
// 取得服务器中已有文件的下載列表

        List<String> fileListInServer=new ArrayList<String> (); 
        
        File dir 
= new
 File(UploadUtil.getUploadPath());        
        String[] children 
=
 dir.list();
        
if (children != null
) {
            
for (int i=0; i<children.length; i++
) {
                fileListInServer.add(children[i]);                
            }
        }
        
        request.setAttribute(
"downloadList"
, fileListInServer);

        
// 跳回原頁面

        RequestDispatcher dispatcher =  request
                .getRequestDispatcher(
"/web/page/uploadtoserver.jsp"
);
        dispatcher.forward(request, response);
        
return
;
    }

    
public void
 doGet(HttpServletRequest request, HttpServletResponse response)
            
throws
 ServletException, java.io.IOException {
        doPost(request, response);
    }
}


从上面的代码可以看出,无论是否文件上传表单域都被当成了FileItem来处理,要区别开来使用isFormField()方法即可,返回真是常规表单域,返回假则是文件上传表单域。

2.多个文件上传到服务器端。

这里采用JS动态生成几个文件上传表单域即可,Servlet无需改变。
多文件上传页面代码如下:

<% @ page contentType = " text/html; charset=UTF-8 " %>
<% @page language = " java "  import = " java.util.List " %>

<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
< html >
< head >
< title > 上传多個文件到服务器 </ title >
< meta  http-equiv ="Content-Type"  content ="text/html; charset=UTF-8" >
< link  rel ="stylesheet"  rev ="stylesheet"  href ="web/css/style.css"
    type
="text/css"   />
</ head >

< body >
    
< div  id ="bodyDiv" >
        
< div  id ="header" >
            
< jsp:include  page ="/web/page/branch/header.jsp" />
        
</ div >
        
< div  id ="sidebar" >
            
< jsp:include  page ="/web/page/branch/sidebar.jsp" />
        
</ div >
        
< div  id ="content" >
            
< fieldset >< legend > 下載列表 </ legend >
                
< ul >
                
<%
                    List
< String >  downloadList = (List < String > )request.getAttribute( " downloadList " );    
                    
                    
if (downloadList! = null ){
                        
for ( String  str:downloadList){    
                            out.print(
" <li><a href='DownloadFile?file= " + str + " '> " + str + " </a></li> " );
                        }
                    }
                
%>
                
</ ul >
            
</ fieldset >
        
            
<!--  enctype属性为表单定义了MIME编码方式,上传文件的表单enctype属性必须如此设置  -->
            
< form  name ="uploadForm"  method ="post"  action ="UploadFile"  enctype ="multipart/form-data"   >
            
< p >< input  type ="button"  value ="增加上传按钮"  onclick ="addUploadButton()" /></ p >
            
< p >< input  type ="file"  name ="myfile1"  value ="浏览文件"   /></ p >
            
< p >< input  type ="submit"  value ="上传" /></ p >
            
</ form >
        
</ div >
        
< div  id ="footer" >
            
< jsp:include  page ="/web/page/branch/footer.jsp" />
        
</ div >
    
</ div >
</ body >


JS代码:

< script LANGUAGE = " JavaScript " >
<!--
var  count = 1 ;

function  addUploadButton(){    
    
//  按ID找到FOrm
     var  uploadForm = document.getElementById( " uploadForm " );    
    
    
//  创建P元素
     var  pNode = document.createElement( " p " );
    
    
//  累加Count以观察次数
    count = count + 1 ;
    
    pNode.innerHTML
= " <input type='file' name='myfile " + count + " ' value='浏览文件'/> " ;
    
    
//  将P元素添加到body中
    uploadForm.appendChild(pNode);
}

// -->
</ script >
</ html >

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值