`

文件上传

 
阅读更多

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

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

<!-- <br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->       
....
< 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代码:

<!-- <br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->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无需改变。
多文件上传页面代码如下:

<!-- <br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><% @ 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代码:

<!-- <br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->< 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 >
分享到:
评论

相关推荐

    php大文件上传,百兆文件上传,有进度条,有上传速度

    之前发布一个大文件上传,但是问题太多,此版本相对上一个稳定得多 1,将压缩包里的 php_uploadprogress.dll 文件复制到你的PHP 安装目录里的扩展库文件夹 就是 ext文件夹下面 2,在你的服务器上随便一个地方(最好...

    JSP无组件文件上传

    在网络上找到的,纯JSP实现的文件上传程序,支持多文件的上传,例子是多文件的上传,稍微修改就可以变成单文件的上传或者更多文件的上传,控制成需要扩展名的文件上传,指定大小的文件上传等。程序目前上传文件存储...

    文件上传和下载文件上传和下载文件上传和下载

    文件上传和下载文件上传和下载文件上传和下载文件上传和下载文件上传和下载文件上传和下载文件上传和下载

    FileUploadUtil.java(文件上传工具类)

    文件上传工具类,上传文件,上传导入文件到path文件夹下,判断图片大小是否超过要求,上传多张图片到服务器,上传图片到服务器,上传文件(在指定目录下创建年月日目录),上传导入文件到temp文件夹下,删除指定...

    Nginx文件上传模块配置

    Nginx是一个高性能的HTTP和反向代理服务器,也是IMAP/POP3/SMTP代理服务器,是由俄罗斯人lgor Sysoev开发,支持模块加载和卸载,其中upload_...我们要做的工作就是要将这两个模块加入到Nginx中,提供文件上传的服务。

    奇安信代码卫士,文件上传漏洞解决demo

    奇安信代码卫士,文件上传漏洞解决demo; #### 文件上传可以参考以下安全需求进行处理: 1. 服务器配置: (1)将上传目录和上传文件设置为不可执行, 杜绝脚本执行。 (2)应保证服务器安全,避免文件解析漏洞。 2....

    基于Python+Django简单实现文件上传下载功能源码.zip

    基于Python+Django简单实现文件上传下载功能源码 基于Python+Django简单实现文件上传下载功能源码 基于Python+Django简单实现文件上传下载功能源码 基于Python+Django简单实现文件上传下载功能源码 基于...

    springMvc单文件多文件上传

    springMvc 文件上传,springMvc 支持单文件和多文件上传,

    PHP文件上传类

    PHP文件上传类,自定义配置,包括单文件和多文件上传(检测文件大小,文件格式,文件重命名,错误返回,全部封装在一个类中)

    文件上传与下载模块源码 源码 上传下载

    一次可上传两个文件,选择文件路径,填写描述,然后单击“上传文件”按钮,即可将文件上传到程序路径下的files文件夹中。 图1.2 文件上传页面 单击“下载文件”按钮,进入文件下载页面,如图1.3所示。单击文件后的...

    文件上传(文件上传)

    文件上传 文件上传 文件上传 文件上传 文件上传

    extjs 4.2 多文件上传

    用Ext编写的多文件上传组件,已封装。 支持多文件上传,文件下载,文件删除,

    绝对好用Flash多文件大文件上传控件

    绝对好用,支持单文件、多文件上传,支持大文件上传,已经过多方面测试,保证好用。 以下附上Uploadify部分常用的参数介绍,要看全部的就去看其API文件了,一般在下载的包里都有。  uploader : uploadify.swf ...

    java多文件上传实现

    java多文件上传实现,上传界面采用flash,同时显示上传进度条

    bootstrap 文件上传组件 fileinput 实现文件批量上传

    Bootstrap文件上传插件File Input是一个不错的文件上传控件,但是搜索使用到的案例不多,经过一番研究,把案例整理出来,供大家学习

    ntko大文件上传

    大文件上传demo,注意需要联网使用,在这个demo中,先给数据库插入文件的基本信息和临时文件名称,再读取文件,建立临时文件夹,将文件存到临时文件中,最后当文件上传完成后,会修改数据库的临时文件名称,删除磁盘...

    文件上传下载需要的jar包 java文件上传下载

    文件上传下载需要的jar包 java文件上传下载 源码 http://blog.csdn.net/da_zhuang/article/details/8737618

    html5文件上传器演示

    客户端完全基于JavaScript的浏览器文件上传器,不需要任何浏览器插件,但需要和jQuery框架协同工作,支持超大文件上传,其算法是将一个超大文件切片成N个数据块依次提交给服务端处理,由服务端存储断点信息实现断点...

    文件上传系统 文件上传系统

    文件上传系统文件上传系统文件上传系统文件上传系统文件上传系统

    http文件上传demo(http模拟POST表单上传文件)

    由于iOS无法通过html表单来上传文件,因此想要上传文件,必须实现http请求,而不能像其他语言那样通过html表单的post就能上传。此demo经过xcode5测试通过。此文件上传demo是按照 rfc1867协议实现的。

Global site tag (gtag.js) - Google Analytics