- 浏览: 23129 次
最新评论
当我们在 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 文件
保存文件do_upload3.jsp(保存文件名到数据库)
UploadServlet.java 文件
程序运行过程截图:(在 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]
但是,如果此时我们在服务器端编写的 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+"&useUnicode=true&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]
- commons-fileupload-1.0-beta-1.jar.rar (218 KB)
- 下载次数: 10
- commons-fileupload-1.2.1.jar (56.4 KB)
- 下载次数: 13
- commons-io-1.4.jar (106.5 KB)
- 下载次数: 12
- commons-beanutils.jar (226.5 KB)
- 下载次数: 9
相关推荐
以下是使用SmartUpload组件在JSP中实现文件上传到服务器的详细步骤: 1. **引入SmartUpload库**:首先,你需要将`jspSmartUplodeCN.jar`这个库文件添加到你的项目类路径中。这可以通过在Web应用的`WEB-INF/lib`目录...
在JSP页面中实现从FTP服务器下载文件主要有三种方式: 1. **直接链接文件地址:** - 这种方法最简单直接,用户点击链接后浏览器会尝试打开或下载该文件。示例代码如下: ```html 用户名:密码@IP地址:端口/路径/...
【标题】"纯jsp上传文件到服务器(利用了struts)"所涉及的知识点主要集中在Web开发领域,尤其是Struts框架的应用以及文件上传的实现。Struts是Apache组织下的一个开源项目,它是一个基于MVC(Model-View-Controller...
acceptFile.jsp文件将上传的文件保存到服务器的文件系统中。 三、JSP文件下载的实现 在示例代码中,使用了自定义的UpFile.tag标签来处理文件下载。UpFile.tag标签将文件下载到客户端,使用Image标签来显示下载的...
在Java Web开发中,JSP(JavaServer Pages)是一种用于创建动态网页的...总的来说,JSP页面实现文件上传下载涉及了HTML表单、Servlet/JSP处理、文件I/O操作等多个方面,理解这些知识点对于进行Java Web开发至关重要。
此外,还可以通过异步处理或使用专门的文件服务器来提高下载速度。 在UpLoadFileProject这个项目中,可能包含了实现以上功能的源代码和配置文件。通过分析这些文件,你可以进一步了解JSP文件下载的具体实现细节,...
3. JSP页面或者Servlet捕获这个请求,解析请求体中的文件数据。 4. 文件数据被保存到服务器的临时目录或指定的存储路径。 5. 服务器返回一个确认消息,告知客户端文件上传成功。 在实现过程中,我们需要注意以下几...
在服务器端,我们需要一个JSP页面(如`upload.jsp`)来接收和处理上传请求。使用`<jsp:useBean>`和`<jsp:setProperty>`标签可以获取表单数据,而`<jsp:include>`标签可以用来处理上传的文件。以下是`upload.jsp`的...
使用JavaScript实现文件上传到本地服务器并获取到上传后文件所在路径,是由到JavaScript,java以及html页面。这个比较好,不是在jsp上获取路径,jsp太简单了,而且过时了,所以就在html页面实现了下功能,我主要是做...
它是一个文件上传组件,简化了在JSP页面中处理文件上传的过程。SmartUpload库提供了一系列API,用于处理文件选择、上传、存储等操作,大大降低了开发者的开发难度。 1. **SmartUpload使用前准备** 在使用`jsp...
在多文件上传中,JSP页面会提交表单到一个Servlet,Servlet负责接收文件并进行处理。 3. **Multipart解析器**: 文件上传涉及到二进制数据,不能直接通过HTTP的普通请求来发送。因此,我们需要使用Multipart解析器...
### 不刷当前JSP页面上传文件的实例 在Web开发中,经常需要处理文件上传功能。传统的文件上传方式是通过表单提交至服务器,这种方式在文件上传后会刷新整个页面,有时这并不是我们想要的结果。特别是在用户体验方面...
JSP页面可以包含表单元素让用户选择要上传的文件,而Servlet接收这些请求,处理文件并返回响应。为了使代码更简洁和可维护,可以将文件操作封装到单独的服务层或者DAO中。 在项目的`upload`子目录中,可能包含了...
"基于jsp的文件上传下载"是Web应用程序中的常见需求,涉及到客户端与服务器之间的数据交互。本项目详细阐述了如何利用JSP实现文件的上传和下载功能。 首先,文件上传涉及的主要技术有HTML表单、Servlet和多部分请求...
在这个"Jsp页面实现文件上传下载"的示例中,我们将深入探讨如何使用JSP来处理文件上传和下载的功能。 一、文件上传 1. **Servlet API**: 文件上传主要依赖于Servlet API中的`Part`接口,它是在Servlet 3.0版本中...
总的来说,"jsp页面内实现批量上传下载"这个实例涵盖了Web开发中文件操作的关键技术,包括JSP编程、HTML5多文件选择、文件上传组件的使用以及文件下载的实现。学习并掌握这些知识,对于提升Web应用的实用性和安全性...
在这个场景下,我们关注的是如何在JSP页面中实现文件的下载功能。这个功能在很多网站上都常见,例如提供文档、软件或其他资源的下载服务。下面我们将详细探讨如何实现这一功能。 首先,为了创建一个下载链接,你...
9. **源码分析**:由于压缩包内文件名仅提供"srcfans.com",无法详细分析具体实现,但通常源码会包含JSP页面、Servlet处理类、JavaScript文件以及可能的CSS样式文件。这些文件分别负责界面展示、业务逻辑处理、用户...
`jsp异步上传文件`这个主题聚焦于如何利用JavaServer Pages (JSP)、Servlet以及JavaScript的ajaxFileupload.js插件来实现在Web应用中异步上传文件。这种方式可以提供更好的用户体验,因为文件上传不会阻塞页面的其他...
在Java服务器页面(JSP)中处理文件上传是一项常见的任务,尤其在开发Web应用程序时,如用户需要上传图片、文档或其他类型的数据。本知识点将详细讲解JSP中的文件上传类和相关技术,以及如何实现一个基本的文件上传...