常见的几种jsp和struts中文件上传方法总结

方法一:
/*********************************************************************************************************
使用FileUpload组件上传文件 

文件上传在web应用中非常普遍,要在jsp环境中实现文件上传功能是非常容易的,因为网上有许多用java开发的文件上传组件,本文以commons-fileupload组件为例,为jsp应用添加文件上传功能。
common-fileupload组件是apache的一个开源项目之一,可以从http://jakarta.apache.org/commons/fileupload/下载。用该组件可实现一次上传一个或多个文件,并可限制文件大小。
下载后解压zip包,将commons-fileupload-1.0.jar复制到tomcat的webapps/你的webapp/WEB-INF/lib/下,目录不存在请自建目录。
新建一个servlet: Upload.java用于文件上传:
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.commons.fileupload.*;

public class Upload extends HttpServlet {

    private String uploadPath = "C://upload//"; // 上传文件的目录
    private String tempPath = "C://upload//tmp//"; // 临时文件目录

    public void doPost(HttpServletRequest request,
    HttpServletResponse response)
    throws IOException, ServletException
    {
    }
}
在doPost()方法中,当servlet收到浏览器发出的Post请求后,实现文件上传。以下是示例代码:
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
    try {
        DiskFileUpload fu = new DiskFileUpload();
        // 设置最大文件尺寸,这里是4MB
        fu.setSizeMax(4194304);
        // 设置缓冲区大小,这里是4kb
        fu.setSizeThreshold(4096);
        // 设置临时目录:
        fu.setRepositoryPath(tempPath);

        // 得到所有的文件:
        List fileItems = fu.parseRequest(request);
        Iterator i = fileItems.iterator();
        // 依次处理每一个文件:
        while(i.hasNext()) {
            FileItem fi = (FileItem)i.next();
            // 获得文件名,这个文件名包括路径:
            String fileName = fi.getName();
            // 在这里可以记录用户和文件信息
            // ...
            // 写入文件,暂定文件名为a.txt,可以从fileName中提取文件名:
            fi.write(new File(uploadPath + "a.txt"));
        }
    }
    catch(Exception e) {
        // 可以跳转出错页面
    }
}
如果要在配置文件中读取指定的上传文件夹,可以在init()方法中执行:
public void init() throws ServletException {
    uploadPath = ....
    tempPath = ....
    // 文件夹不存在就自动创建:
    if(!new File(uploadPath).isDirectory())
        new File(uploadPath).mkdirs();
    if(!new File(tempPath).isDirectory())
        new File(tempPath).mkdirs();
}
编译该servlet,注意要指定classpath,确保包含commons-upload-1.0.jar和tomcat/common/lib/servlet-api.jar。
配置servlet,用记事本打开tomcat/webapps/你的webapp/WEB-INF/web.xml,没有的话新建一个。
典型配置如下:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
    <servlet>
        <servlet-name>Upload</servlet-name>
        <servlet-class>Upload</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>Upload</servlet-name>
        <url-pattern>/fileupload</url-pattern>
    </servlet-mapping>
</web-app>
配置好servlet后,启动tomcat,写一个简单的html测试:
<form action="fileupload" method="post"
enctype="multipart/form-data" name="form1">
  <input type="file" name="file">
  <input type="submit" name="Submit" value="upload">
</form>
注意action="fileupload"其中fileupload是配置servlet时指定的url-pattern。
 


方法二:
/*******************************************************************************
三、选择上传文件页面:selfile.jsp,如此访问此页面:
<html:link module="/upload" page="/upload.do"> 继续上传</html:link></h2>

--------------------------------------------------------------------------------
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="org.apache.struts.action.*,
                 java.util.Iterator,
                 org.apache.struts.Globals" %>
<%@ taglib uri="/tags/struts-bean" prefix="bean" %>
<%@ taglib uri="/tags/struts-html" prefix="html" %>
<%@ taglib uri="/tags/struts-logic" prefix="logic" %>
<logic:messagesPresent>
   <ul>
   <html:messages id="error">
      <li><bean:write name="error"/></li>
   </html:messages>
   </ul><hr />
</logic:messagesPresent>
<html:html>

<html:form action="uploadsAction.do" enctype="multipart/form-data">
<html:file property="theFile"/>
<html:submit/>
</html:form>
</html:html>

--------------------------------------------------------------------------------

四、表单bean:  UpLoadForm.java

--------------------------------------------------------------------------------
package org.apache.struts.webapp.upload;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.*;
import org.apache.struts.upload.*;

/**
 * <p>Title:UpLoadForm</p>
 * <p>Description: QRRSMMS </p>
 * <p>Copyright: Copyright (c) 2004 jiahansoft</p>
 * <p>Company: jiahansoft</p>
 * @author wanghw
 * @version 1.0
 */

public class UpLoadForm extends ActionForm {
  public static final String ERROR_PROPERTY_MAX_LENGTH_EXCEEDED = "org.apache.struts.webapp.upload.MaxLengthExceeded";
  protected FormFile theFile;
  public FormFile getTheFile() {
      return theFile;
  }
  public void setTheFile(FormFile theFile) {
      this.theFile = theFile;
  }
   public ActionErrors validate(
        ActionMapping mapping,
        HttpServletRequest request) {
            
        ActionErrors errors = null;
        //has the maximum length been exceeded?
        Boolean maxLengthExceeded =
            (Boolean) request.getAttribute(
                MultipartRequestHandler.ATTRIBUTE_MAX_LENGTH_EXCEEDED);
                
        if ((maxLengthExceeded != null) && (maxLengthExceeded.booleanValue())) {
            errors = new ActionErrors();
            errors.add(
                ActionMessages.GLOBAL_MESSAGE ,
                new ActionMessage("maxLengthExceeded"));
            errors.add(
                ActionMessages.GLOBAL_MESSAGE ,
                new ActionMessage("maxLengthExplanation"));
        }
        return errors;

    }

}


--------------------------------------------------------------------------------
五、处理上传的文件:UpLoadAction.java 
--------------------------------------------------------------------------------
package org.apache.struts.webapp.upload;
import java.io.*;
import javax.servlet.http.*;
import org.apache.struts.action.*;
import org.apache.struts.upload.FormFile; 

/**
 * <p>Title:UpLoadAction</p>
 * <p>Description: QRRSMMS </p>
 * <p>Copyright: Copyright (c) 2004 jiahansoft</p>
 * <p>Company: jiahansoft</p>
 * @author wanghw
 * @version 1.0
 */

public class UpLoadAction extends Action {
  public ActionForward execute(ActionMapping mapping,
                               ActionForm form,
                               HttpServletRequest request,
                               HttpServletResponse response)
      throws Exception {
       if (form instanceof UpLoadForm) {//如果form是UpLoadsForm
           String encoding = request.getCharacterEncoding();

       if ((encoding != null) && (encoding.equalsIgnoreCase("utf-8")))
        {
            response.setContentType("text/html; charset=gb2312");
        }
        UpLoadForm theForm = (UpLoadForm ) form;
        FormFile file = theForm.getTheFile();//取得上传的文件
        String contentType = file.getContentType();

        String size = (file.getFileSize() + " bytes");//文件大小
        String fileName= file.getFileName();//文件名
        try {
          InputStream stream = file.getInputStream();//把文件读入
          String filePath = request.getRealPath("/");//取当前系统路径
          ByteArrayOutputStream baos = new ByteArrayOutputStream();
          OutputStream bos = new FileOutputStream(filePath + "/" +
                                                  file.getFileName());
              //建立一个上传文件的输出流,将上传文件存入web应用的根目录。
          //System.out.println(filePath+"/"+file.getFileName());
          int bytesRead = 0;
          byte[] buffer = new byte[8192];
          while ( (bytesRead = stream.read(buffer, 0, 8192)) != -1) {
            bos.write(buffer, 0, bytesRead);//将文件写入服务器
          }
          bos.close();
          stream.close();
        }catch(Exception e){
          System.err.print(e);
        }
        //request.setAttribute("dat",file.getFileName());
         request.setAttribute("contentType", contentType);
         request.setAttribute("size", size);
         request.setAttribute("fileName", fileName);

        return mapping.findForward("display");
    }
    return null;
  }
}
------------------------------------------------------------------------------------------

五、成功页display.jsp 
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="org.apache.struts.action.*,
                 java.util.Iterator,
                 org.apache.struts.Globals" %>
<%@ taglib uri="/tags/struts-html" prefix="html" %>


上传成功!上传信息如下:
<p>
<b>The File name:</b> <%= request.getAttribute("fileName") %>
</p>
<p>
<b>The File content type:</b> <%= request.getAttribute("contentType") %>
</p>
<p>
<b>The File size:</b> <%= request.getAttribute("size") %>
</p>
<hr />
<hr />
<html:link module="/upload" page="/upload.do"> 继续上传</html:link></h2>
 六、测试
 从本站下载整个目录结构TestStruts并放入tomcat的webapps目录下,在浏览器中输入:
http://127.0.0.1:8080/TestStruts/upload/upload.do

方法三(cos包)
/******************************************************************
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>无标题文档</title>
</head>

<body>
<!-- enctype的值很重要,upload.jsp为处理上传的jsp-->
<form name="form1"  method="post" enctype="multipart/form-data" action="upload.jsp">
<p>
  <input name="file1" type="file">
</p>
<p>
  <input name="file2" type="file">
</p>
<p>  <input name="file3" type="file">
</p>
<p>
  <input type="submit" name="Submit" value="上传">
</p>
</form >

</body>
</html>[/pre]


3.在c:/下建一个目录c:/upload,用来存放上传的文件。

 

4.写一个jsp或者servlet来实现上传。

upload.jsp

 

<%@page import="java.io.*"%><%@page import="com.oreilly.servlet.MultipartRequest"%><%@page import="com.oreilly.servlet.multipart.CoverFileRenamePolicy"%><%@page contentType="text/html; charset=gb2312" %><%//文件上传后,保存在c://uploadString saveDirectory ="c://upload";//每个文件最大5m,最多3个文件,所以...int maxPostSize =3 * 5 * 1024 * 1024 ;//response的编码为"gb2312",同时采用缺省的文件名冲突解决策略,实现上传MultipartRequest multi =       new MultipartRequest(request, saveDirectory, maxPostSize,                            "gb2312");//输出反馈信息 Enumeration files = multi.getFileNames();     while (files.hasMoreElements()) {        System.err.println("ccc");       String name = (String)files.nextElement();       File f = multi.getFile(name);       if(f!=null){         String fileName = multi.getFilesystemName(name);         String lastFileName= saveDirectory+"//" + fileName;         out.println("上传的文件:"+lastFileName);         out.println("<hr>");       }     }%><meta http-equiv="Content-Type" content="text/html; charset=gb2312">


/******************************************************************

区别

******************************************************************/
在cos组件中,multipartrequest类主要负责文件上传的处理。multipartrequest有8个构造函数:

1.public multipartrequest ( httpservletrequest request, string savedirectory,) throws ioexception

2.public multipartrequest ( httpservletrequest request, string savedirectory, int maxpostsize) throws ioexception

3.public multipartrequest ( httpservletrequest request, string savedirectory, int maxpostsize, filerenamepolicy policy) throws ioexception

4.public multipartrequest ( httpservletrequest request, string savedirectory, int maxpostsize, string encoding) throws ioexception

5.public multipartrequest ( httpservletrequest request, string savedirectory, int maxpostsize, string encoding, filerenamepolicy policy) throws ioexception

6.public multipartrequest ( httpservletrequest request, string savedirectory, string encoding) throws ioexception

7.public multipartrequest ( httpservletrequest request, string savedirectory) throws ioexception

8.public multipartrequest ( httpservletrequest request, string savedirectory, int maxpostsize) throws ioexception

前6种构造函数都是用来专门处理http协议的,savedirectory是上传文件要存储在服务器端的目录名称;maxpostsize是用来限制用户上传文件大小的,若超过maxpostszie,会产生ioexception,默认上传文件大小是1mb;encoding可以设定用何种编码方式来上传文件名称,可以解决中文问题。

multipartrequest类工具有8种方法,利用这些方法,我们可以取得请求的相关信息:

public enumeration getparameternames()

可以取得请求参数的名称

public string getparameter(string name)

此方法传回参数为name的值

public string[] getparametervalues(string name)

此方法主要用在取得当一指定参数具有多个值时,它会传回string的数组

public enumeration getfilename()

传回所有文件输入类型的名称

public string getfilesystemnames(string name)

用此方法得到上传文件的真正的文件名,这里的name指文件输入类型的名称

public string getcontenttype(string name)

此方法得到上传文件的内容类型

public file getfile(string name)

此方法得到一个文件对象,代表储存在服务器上的name文件

public string getoriginalfilename(string name)

返回文件在修改政策有效之前的文件名

3 jspsmartupload
jspsmartupload组件是由jspsmart公司开发的,安装好它的组件以后,就可以处理文件上传及下载的问题。该组件简单好用,免费,但是源码不公开。

jspsmartupload overview:

free 免费的

upload 1or more files to the server 可上传1个或多个文件

upload to a database 上传文件到数据库

control the upload file by file 可以一列一列的(一个个)控制上传

manage mixed forms files +form fields 可以管理表格文件和表格域

download a file 可以实现文件下载

download a database field 可以从数据库中下载

restrict file size , extension etc 可以限制上传文件的尺寸和类型

macbinary support mckbinary的支持

platform: apache, nt, unix, linux, iis 可以在多种平台上运行

database : mysql , oracle…… 支持多种数据库(最支持mysql)

整个jspsmartupload压缩包113k,包括有范例、api说明和编译好的class文件,调用这些class文件就可以实习文件的上传下载功能。


图2 jspsmartupoad

jspsmartupload能实现比o`rrilly-cos更多的方法,比如有:

1.public int getsize()方法得到上传文件大小的总和

2.public void setdeniedfileslist(string deniedfileslist)方法设定用户不可上传的类型

3.public void setallowedfileslist(string allowedfileslist)方法设定用户可上传的文件类型

4.public void settotalmaxfilesize(long totalmaxfileslist)设定一次上传文件大小总和

5.public int getcount()得到files中的文件个数

6.public boolean ismissing()测试文件是否确实已经存在

7.public string getfieldname()得到此file在前一个html文件中的表格名称

8.public string getfilepathname()得到此file在上传端的文件位置

9.public string getfileext()得到文件的扩展名

………….

jspsmartupload的安装:只需把这些class文件拷贝到classes文件夹中即可。

4 jakarta apache struts upload
由于本项目是用struts结构开发的,所以利用struts自带的类工具实现上传,这能和工程整体结合的很好,不需要导入其他的包,并且功能强大,使用简单,性能稳定且开源,所以无疑是最佳的选择。

下图是struts中upload包的结构。基本上要实现上传功能,只要用到formfiles和multipartrequesthandler接口就可以解决了。


图3 struts-upload包的结构

基本处理流程是,从页面中传递文件到form中,然后从action得到form中的文件,形成inputstream,然后通过outputstream写入磁盘。

同样,struts的upload工具类也可以实现对上传文件大小和类型的控制,可以同时上传多个文件等等。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值