`
cx1899
  • 浏览: 23088 次
社区版块
存档分类
最新评论

JSP页面上传文件到服务器(转)

    博客分类:
  • jsp
jsp 
阅读更多
当我们在 HTML 表单中选择本地文件之后点击“提交”按钮则会将文件上传到服务器中,此时该 HTTP 请求正文的数据类型就是 multipart/form-data 型的。而在 Servlet 技术中,该 HTTP 请求会被 Servlet 容器(如 Tomcat)包装成 HttpServletRequest 对象,再由端所请求的相应 Servlet 进行处理。
但是,如果此时我们在服务器端编写的 Servlet 一点点地解析这个 HTTP 请求,分离出其中的文本表单和上传的文件类型,这未免有点低效。于是,我们可以使用 Apache 开源上传软件包 fileupload 来简化这一过程,直接使用即可。下载地址:http://commons.apache.org/fileupload/
在 fileupload 包中, HTTP 请求中的复杂表单元素都被看做一个 FileItem 对象;FileItem 对象必须由 ServletFileUpload 类中的 parseRequest() 方法解析 HTTP 请求(即被包装之后的 HttpServletRequest 对象)出来,即分离出具体的文本表单和上传文件;而 ServletFileUpload 对象的创建需要依赖于 FileItemFactory 工厂将获得的上传文件 FileItem 对象保存至服务器硬盘,即 DiskFileItem 对象。
呼…把这个 fileupload 包中的关系讲得那么乱,最好还是自己看下载下来的帮助文档。不过,推荐一个免费的 Java 反编译器 JD-GUI ,用它能够很轻松地打开 .jar 文件,除了源代码中的注释,其他的一览无遗,很好用啊。下载地址:http://java.decompiler.free.fr/?q=jdgui
好吧,我们的程序要求:
1、提供一个 HTML 文件,用户可在相应表单中选择需要上传的文件;
2、编写一个名叫 UploadServlet 的Servlet 文件,主要功能是解析上面 HTML 表单所提交的 HTTP 请求,把普通的文本域和文件域分离开来;
3、UploadServlet 根据 web.xml 配置文件中的初始化参数确定好需要在 Web 服务器存放该文件的目录,将上传的文件写入到该存放目录中,在我的这里我把上传的文件保存到 F:\java\JavaWeb\ch05\uploadFile 目录中,而 F:\java\JavaWeb\ch05\temp 目录则用作该 Web 应用的临时目录。
程序代码:
upload.html 文件
<html> 
    <head>  <title>Servlet 上传文件</title></head> 
    <body > 
      <form name="uploadForm" method="POST" 
        enctype="MULTIPART/FORM-DATA" 
        action="upload"> 
 
        User Name:<input type="text" name="username" size="30"/> 
        Upload File1:<input type="file" name="file1" size="30"/> 
        Upload File2:<input type="file" name="file2" size="30"/>   
        <input type="submit" name="submit" value="上传"> 
        <input type="reset" name="reset" value="重置"> 
      </form> 
    </body> 
</html> 

保存文件do_upload3.jsp(保存文件名到数据库)
<%@ page contentType="text/html; charset=utf-8" %>
  <%@   page   import="java.util.*"%>  
  <%@   page   import="org.apache.commons.fileupload.servlet.ServletFileUpload"%> 
  <%@   page   import="org.apache.commons.fileupload.disk.DiskFileItemFactory"%>  
   <%@   page   import="org.apache.commons.fileupload.FileItem"%> 
  <%@   page   import="java.io.File"%>
    <%@   page   import="java.io.IOException"%>
    <%@   page   import="org.apache.commons.io.output.DeferredFileOutputStream"%>
    <%@ page  import="java.text.SimpleDateFormat"%>
<%@page import="com.mysql.jdbc.Driver"%>
<%@page import="java.sql.*"%>
<%@page import="com.mysql.jdbc.ResultSetMetaData"%>
    
  <html>  
  <head>  
  <title>保存上传文件</title>  
  </head>  
  <%  
   DiskFileItemFactory factory = new DiskFileItemFactory();
   factory.setSizeThreshold(1024*1024); //设置缓存大小,单位KB
   String path = request.getRealPath("/images"); //得到当前项目upload目录的绝对路径
   factory.setRepository(new File(path)); //设置文件临时存储路径为path
   ServletFileUpload upload = new ServletFileUpload(factory);
   String fileName=null;
   try {
    List<FileItem> list = upload.parseRequest(request);
    for(FileItem item : list){
     //如果item是普通表单字段
     if(item.isFormField()){
      String name = item.getFieldName(); //得到表单字段的name属性值
      String value = item.getString("gbk"); //得到表单字段值,编码采用gbk
      request.setAttribute(name, value);
     }else
     {
      String name = item.getFieldName();
      String value = item.getName(); //得到上传文件的路径(根据浏览器不同可能会有所差异)
      int start = value.lastIndexOf("\\");
      fileName = value.substring(start+1); //截取最后一个\之后的字符,即行到上传文件名
      request.setAttribute(name, fileName);
     
      item.write(new File(path,fileName)); //在硬盘上写入文件
       }
    }
     String driverName = "com.mysql.jdbc.Driver"; //驱动名称
    String DBUser = "root"; //mysql用户名
    String DBPasswd = "admin"; //mysql密码
    String DBName = "healthlportal610"; //数据库名

    //数据库完整链接地址
    String connUrl = "jdbc:mysql://localhost/" + DBName + "?user="
            + DBUser + "&password=" + DBPasswd+"&amp;useUnicode=true&amp;characterEncoding=utf8";

    //加载数据库驱动
    Class.forName(driverName).newInstance();

    //链接数据库并保存到 conn 变量中
    Connection conn = DriverManager.getConnection(connUrl);

    //申明~?
    Statement stmt = conn.createStatement();

    //设置字符集
  // stmt.executeQuery("SET NAMES 'gb2312'");
  //SmartUpload su = new SmartUpload();




/*Cookie myCookie[]=request.getCookies();//创建一个Cookie对象数组
for(int n=0;n=myCookie.length-1;n++)//设立一个循环,来访问Cookie对象数组的每一个元素
Cookie newCookie= myCookie[n];
if(newCookie.getName().equals("num")); //判断元素的值是否为username中的值
{
str2= newCookie.getValue();//如果找到后,向他问好
}*/


	

String sql =null;

 sql = "INSERT INTO railway_assess(jieche) VALUES('"+fileName+"')";

    //取得结果
     stmt.executeUpdate(sql);


    
     //out.print(sql);
     
      //要执行的 sql 查询
     
     
  /** 关闭连接 **/
  
  	conn.close();
    stmt.close();
   } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  %>  
  
  </body>  
  </html>


UploadServlet.java 文件
import javax.servlet.*;  
import javax.servlet.http.*;  
import java.io.*;  
import java.util.*;  
import org.apache.commons.fileupload.*;  
import org.apache.commons.fileupload.servlet.*;  
import org.apache.commons.fileupload.disk.*;  
 
// Servlet 文件上传  
public class UploadServlet extends HttpServlet  
{  
    private String filePath;    // 文件存放目录  
    private String tempPath;    // 临时文件目录  
 
    // 初始化  
    public void init(ServletConfig config) throws ServletException  
    {  
        super.init(config);  
        // 从配置文件中获得初始化参数  
        filePath = config.getInitParameter("filepath");  
        tempPath = config.getInitParameter("temppath");  
 
        ServletContext context = getServletContext();  
 
        filePath = context.getRealPath(filePath);  
        tempPath = context.getRealPath(tempPath);  
        System.out.println("文件存放目录、临时文件目录准备完毕 ...");  
    }  
      
    // doPost  
    public void doPost(HttpServletRequest req, HttpServletResponse res)  
        throws IOException, ServletException  
    {  
        res.setContentType("text/plain;charset=gbk");  
        PrintWriter pw = res.getWriter();  
        try{  
            DiskFileItemFactory diskFactory = new DiskFileItemFactory();  
            // threshold 极限、临界值,即硬盘缓存 1M  
            diskFactory.setSizeThreshold(4 * 1024);  
            // repository 贮藏室,即临时文件目录  
            diskFactory.setRepository(new File(tempPath));  
          
            ServletFileUpload upload = new ServletFileUpload(diskFactory);  
            // 设置允许上传的最大文件大小 4M  
            upload.setSizeMax(4 * 1024 * 1024);  
            // 解析HTTP请求消息头  
            List fileItems = upload.parseRequest(req);  
            Iterator iter = fileItems.iterator();  
            while(iter.hasNext())  
            {  
                FileItem item = (FileItem)iter.next();  
                if(item.isFormField())  
                {  
                    System.out.println("处理表单内容 ...");  
                    processFormField(item, pw);  
                }else{  
                    System.out.println("处理上传的文件 ...");  
                    processUploadFile(item, pw);  
                }  
            }// end while()  
 
            pw.close();  
        }catch(Exception e){  
            System.out.println("使用 fileupload 包时发生异常 ...");  
            e.printStackTrace();  
        }// end try ... catch ...  
    }// end doPost()  
 
 
    // 处理表单内容  
    private void processFormField(FileItem item, PrintWriter pw)  
        throws Exception  
    {  
        String name = item.getFieldName();  
        String value = item.getString();          
        pw.println(name + " : " + value + "\r\n");  
    }  
      
    // 处理上传的文件  
    private void processUploadFile(FileItem item, PrintWriter pw)  
        throws Exception  
    {  
        // 此时的文件名包含了完整的路径,得注意加工一下  
        String filename = item.getName();         
        System.out.println("完整的文件名:" + filename);  
        int index = filename.lastIndexOf("\\");  
        filename = filename.substring(index + 1, filename.length());  
 
        long fileSize = item.getSize();  
 
        if("".equals(filename) && fileSize == 0)  
        {             
            System.out.println("文件名为空 ...");  
            return;  
        }  
 
        File uploadFile = new File(filePath + "/" + filename);  
        item.write(uploadFile);  
        pw.println(filename + " 文件保存完毕 ...");  
        pw.println("文件大小为 :" + fileSize + "\r\n");  
    }  
      
    // doGet  
    public void doGet(HttpServletRequest req, HttpServletResponse res)  
        throws IOException, ServletException  
    {  
        doPost(req, res);  
    }  
} 
web.xml 文件
<?xml version="1.0" encoding="gb2312"?> 
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" 
    version="2.4"> 
 
    <servlet> 
        <servlet-name>UploadServlet</servlet-name> 
        <servlet-class>UploadServlet</servlet-class> 
 
        <init-param> 
            <param-name>filepath</param-name> 
            <param-value>uploadFile</param-value> 
        </init-param> 
        <init-param> 
            <param-name>temppath</param-name> 
            <param-value>temp</param-value> 
        </init-param> 
    </servlet>      
 
    <servlet-mapping> 
        <servlet-name>UploadServlet</servlet-name> 
        <url-pattern>/upload</url-pattern> 
    </servlet-mapping> 
 
</web-app> 


程序运行过程截图:(在 web.xml 文件中我们把UploadServlet 映射为 upload)
1、启动 Tomcat ,在浏览器输入 URL 并填写 HTML 表单,如下:

2、点击“上传”,发出一个包含了上传文件的复杂 HTTP 请求,由 UploadServlet 进行处理:
先看下 Tomcat 的控制台输出信息:

再看一下浏览器的相应输出:

最后看上传的文件是否被被保存在指定的目录中:

嗯,文件目录和文件保存时间都正确,就是文件大小忘了转化一下…(*^__^*) …
小结:
1、使用开源的 fileupload 包为我们在 UploadServlet 代码中显式地用繁杂的 request.getParameter(“username”) 语句来获取 HTTP 请求所包含的表单值;
2、而且还省去了我们在 UploadServlet 中自己编写判断表单是否是文件或文本类型的代码;
3、更重要的是,FileItem 对象的响应方法可以使得我们轻松地获取文件名、文件大小、路径等等;
4、最重要的是,使用 JD-GUI 反编译器简单地看看开源的 fileupload 包中的类组织结构,这更加有意思、有用处,:-D
本文出自 “蚂蚁” 博客,请务必保留此出处http://haolloyin.blog.51cto.com/1177454/368162[b][/b]
分享到:
评论

相关推荐

    使用jsp上传文件到服务器的具体方法

    以下是使用SmartUpload组件在JSP中实现文件上传到服务器的详细步骤: 1. **引入SmartUpload库**:首先,你需要将`jspSmartUplodeCN.jar`这个库文件添加到你的项目类路径中。这可以通过在Web应用的`WEB-INF/lib`目录...

    java+jsp代码实现从FTP服务器上传下载文件

    在JSP页面中实现从FTP服务器下载文件主要有三种方式: 1. **直接链接文件地址:** - 这种方法最简单直接,用户点击链接后浏览器会尝试打开或下载该文件。示例代码如下: ```html 用户名:密码@IP地址:端口/路径/...

    纯jsp上传文件到服务器(利用了struts)

    【标题】"纯jsp上传文件到服务器(利用了struts)"所涉及的知识点主要集中在Web开发领域,尤其是Struts框架的应用以及文件上传的实现。Struts是Apache组织下的一个开源项目,它是一个基于MVC(Model-View-Controller...

    JSP实现文件上传与下载.pdf

    acceptFile.jsp文件将上传的文件保存到服务器的文件系统中。 三、JSP文件下载的实现 在示例代码中,使用了自定义的UpFile.tag标签来处理文件下载。UpFile.tag标签将文件下载到客户端,使用Image标签来显示下载的...

    jsp页面实现文件上传下载

    在Java Web开发中,JSP(JavaServer Pages)是一种用于创建动态网页的...总的来说,JSP页面实现文件上传下载涉及了HTML表单、Servlet/JSP处理、文件I/O操作等多个方面,理解这些知识点对于进行Java Web开发至关重要。

    jsp页面下载文件

    此外,还可以通过异步处理或使用专门的文件服务器来提高下载速度。 在UpLoadFileProject这个项目中,可能包含了实现以上功能的源代码和配置文件。通过分析这些文件,你可以进一步了解JSP文件下载的具体实现细节,...

    纯jsp实现文件上传(页面无刷新,表单数据可连续填写最后上传文件)

    在服务器端,我们需要一个JSP页面(如`upload.jsp`)来接收和处理上传请求。使用`&lt;jsp:useBean&gt;`和`&lt;jsp:setProperty&gt;`标签可以获取表单数据,而`&lt;jsp:include&gt;`标签可以用来处理上传的文件。以下是`upload.jsp`的...

    JSP同时选择多文件上传MultifileUploadDemo

    3. JSP页面或者Servlet捕获这个请求,解析请求体中的文件数据。 4. 文件数据被保存到服务器的临时目录或指定的存储路径。 5. 服务器返回一个确认消息,告知客户端文件上传成功。 在实现过程中,我们需要注意以下几...

    在html页面使用JavaScript实行文件上传到本地服务器并获取文件所在路径

    使用JavaScript实现文件上传到本地服务器并获取到上传后文件所在路径,是由到JavaScript,java以及html页面。这个比较好,不是在jsp上获取路径,jsp太简单了,而且过时了,所以就在html页面实现了下功能,我主要是做...

    jsp上传文件到服务器所需jar包及步骤.rar

    它是一个文件上传组件,简化了在JSP页面中处理文件上传的过程。SmartUpload库提供了一系列API,用于处理文件选择、上传、存储等操作,大大降低了开发者的开发难度。 1. **SmartUpload使用前准备** 在使用`jsp...

    JSP多文件上传(同时上传)

    在多文件上传中,JSP页面会提交表单到一个Servlet,Servlet负责接收文件并进行处理。 3. **Multipart解析器**: 文件上传涉及到二进制数据,不能直接通过HTTP的普通请求来发送。因此,我们需要使用Multipart解析器...

    不刷当前jsp页面上传文件的实例

    ### 不刷当前JSP页面上传文件的实例 在Web开发中,经常需要处理文件上传功能。传统的文件上传方式是通过表单提交至服务器,这种方式在文件上传后会刷新整个页面,有时这并不是我们想要的结果。特别是在用户体验方面...

    jsp文件的上传和下载

    JSP页面可以包含表单元素让用户选择要上传的文件,而Servlet接收这些请求,处理文件并返回响应。为了使代码更简洁和可维护,可以将文件操作封装到单独的服务层或者DAO中。 在项目的`upload`子目录中,可能包含了...

    基于jsp的文件上传下载

    "基于jsp的文件上传下载"是Web应用程序中的常见需求,涉及到客户端与服务器之间的数据交互。本项目详细阐述了如何利用JSP实现文件的上传和下载功能。 首先,文件上传涉及的主要技术有HTML表单、Servlet和多部分请求...

    Jsp页面实现文件上传下载.rar

    在这个"Jsp页面实现文件上传下载"的示例中,我们将深入探讨如何使用JSP来处理文件上传和下载的功能。 一、文件上传 1. **Servlet API**: 文件上传主要依赖于Servlet API中的`Part`接口,它是在Servlet 3.0版本中...

    jsp页面内实现批量上传下载.rar

    总的来说,"jsp页面内实现批量上传下载"这个实例涵盖了Web开发中文件操作的关键技术,包括JSP编程、HTML5多文件选择、文件上传组件的使用以及文件下载的实现。学习并掌握这些知识,对于提升Web应用的实用性和安全性...

    jsp页面实现文件的下载功能

    在这个场景下,我们关注的是如何在JSP页面中实现文件的下载功能。这个功能在很多网站上都常见,例如提供文档、软件或其他资源的下载服务。下面我们将详细探讨如何实现这一功能。 首先,为了创建一个下载链接,你...

    JSP文件上传 支持进度条显示.rar

    9. **源码分析**:由于压缩包内文件名仅提供"srcfans.com",无法详细分析具体实现,但通常源码会包含JSP页面、Servlet处理类、JavaScript文件以及可能的CSS样式文件。这些文件分别负责界面展示、业务逻辑处理、用户...

    jsp异步上传文件

    `jsp异步上传文件`这个主题聚焦于如何利用JavaServer Pages (JSP)、Servlet以及JavaScript的ajaxFileupload.js插件来实现在Web应用中异步上传文件。这种方式可以提供更好的用户体验,因为文件上传不会阻塞页面的其他...

    jsp文件上传类 jsp文件上传类

    在Java服务器页面(JSP)中处理文件上传是一项常见的任务,尤其在开发Web应用程序时,如用户需要上传图片、文档或其他类型的数据。本知识点将详细讲解JSP中的文件上传类和相关技术,以及如何实现一个基本的文件上传...

Global site tag (gtag.js) - Google Analytics