JSP学习笔记(第五天)

来源:互联网 发布:百度地图js api 导航 编辑:程序博客网 时间:2024/04/29 11:02

文件上传


common-fileupload组件是apache的一个开源项目之一,可以从http://jakarta.apache.org/commons/fileupload/下载。该组件简单易用,可实现一次上传一个或多个文件,并可限制文件大小。commons-fileupload-1.0.jar复制到tomcat的webapps/你的webapp/WEB-INF/lib/下

使用Tomcat的Manager部署servlet是出现java.lang.NoClassDefFoundError异常的解决方法Tue, 11/04/2008 - 10:44 — Fuller

使用Tomcat的Manager部署应用程序(servlet)时,可能会出现以下异常(视Tomcat版本):

javax.servlet.ServletException: Servlet execution threw an exception...java.lang.NoClassDefFoundError: org/apache/commons/io/output/DeferredFileOutputStream...java.lang.ClassNotFoundException: org.apache.commons.io.output.DeferredFileOutputStream...

详细原因分析可以参见,简而言之,是因为当commons-fileupload包从版本1.0升到1.1时,DeferredFileOutputStream.class被移走了。如果Tomcat使用1.1及其以上版本,你得为它找到这个类。



解决方法

进入目录:$CATALINA/server/webapps/manager/WEB-INF/lib,检查是否存在三个包:

  • commons-io
  • catalina-manager.jar
  • commons-fileupload.jar

如果缺少commons-io,拷一个过来。

或者直接使用老版本的commons-fileupload.jar

新建一个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{    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();            if(fileName!=null) {                // 在这里可以记录用户和文件信息                // ...                // 写入文件a.txt,你也可以从fileName中提取文件名:                fi.write(new File(uploadPath + "a.txt"));            }        }        // 跳转到上传成功提示页面    }    catch(Exception e) {        // 可以跳转出错页面    }}public void init() throws ServletException {    uploadPath = "D://upload//";    tempPath = "D://updoad//";    // 文件夹不存在就自动创建:    if(!new File(uploadPath).isDirectory())        new File(uploadPath).mkdirs();    if(!new File(tempPath).isDirectory())        new File(tempPath).mkdirs();}}

配置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>