使用Servlet做文件上传,当然,底层的工作还是有开源的框架,即便如此,也着实耗费了我一些功夫。下面开始进行讲解,文件上传功能是Java在Web应用中常用的功能之一,也是程序员必回的一项技能。
首先,我要使用到apache的一个开源jar包,为file-upload.jar,这个jar包封装了对用户上传的文件的操作,同时该jar包需要依赖common-io.jar,commons-io.jar封装了一些对文件底层的操作,具体原理我也没有研究,有兴趣的自己去apache官方下载研究。
再说下文件上传需要的java类,主要使用到了org.apache.commons.fileupload.disk包中的DiskFileItemFactory类(主要供实例化文件上传高层API实例化使用)和DiskFileItem类(判断表单中的提交的元素是否为文件类型,若是,则进行写入到磁盘操作(需要程序员手动去写))。
首先,开始进行实际操作,新建一个web工程,工程目录结构如下图所示:
第一步,写界面:fileUpload.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>fileUpload</title>
</head>
<body>
<h3>文件上传Demo</h3>
<form action="fileUploadloadServlet" method="post" enctype="multipart/form-data">
名字:<input type="text" name="name"><br>
file1:<input type="file" name="file1"><br>
file2:<input type="file" name="file2"><br/>
<input type="submit" value="提交">
</form>
fileUploadSucces.jsp:
<%@ page language="java" import="java.util.*" isELIgnored="false" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>文件上传成功</title>
</head>
<body>
名字:${requestScope.name }<br/>
file1:${requestScope.file1 }<br/>
file2:${requestScope.file2 }
</body>
</html>
</body>
</html>
第二步:新建一个Servlet,名字为FileUploadloadServlet.java,代码如下
import java.io.File;
import java.io.IOException;
import java.util.List;
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.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
/**
* 使用Servlet进行文件上传Demo
*
* @author XiaoYun 2013-07-22
*/
public class FileUploadloadServlet extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 2818543291976552632L;
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
String path = this.getServletConfig().getServletContext().getRealPath("/upload");
System.out.println(path);
// 创建磁盘文件工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置超出文件默认大小后文件存放在硬盘上的位置
factory.setRepository(new File(path));
// 实例化封装文件上传的高层API
ServletFileUpload upload = new ServletFileUpload(factory);
try {
// 从request中获取文件
List<FileItem> items = upload.parseRequest(req);
for (FileItem fileItem : items) {
// 获取输入框或表单的名字
String name = fileItem.getFieldName();
if (fileItem.isFormField()) { // 判断是否是为简单的表单类型
String value = fileItem.getString();
req.setAttribute(name, value);
} else { // 是文件类型
// 同时可以进行多文件上传
// 获取上传的文件名
String fileName = fileItem.getName();
fileName = fileName.substring(fileName.indexOf("\\") + 1);
req.setAttribute(name, fileName);
fileItem.write(new File(path, fileName));
}
}
req.getRequestDispatcher("fileUploadSuccess.jsp").forward(req, resp);
} catch (Exception e) {
e.printStackTrace();
}
}
}
第三部:编写配置文件web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>FileUploadloadServlet</servlet-name>
<servlet-class>com.servlet.upload.FileUploadloadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FileUploadloadServlet</servlet-name>
<url-pattern>/fileUploadloadServlet</url-pattern>
</servlet-mapping>
</web-app>
第四步,也是很多人都容易忽略的一步(如果你想把文件上传到当前工程的目录下的话),系统默认是上传到tomcat的部署工程目录下。 打开tomcat安装目录\conf\server.xml,在</Host>前面加上<Context path="/fileUpload(你的工程名字)" docBase="D:\Workspaces\study\fileUpload\WebRoot(你的WebRoot目录的绝对路径)" reloadable="true"/>
</Host>
好,这样一个Demo就写完了,启动tomcat(我的版本是5.5),就可以进行文件操作了,在我机器上试过了,可以跑通没有问题。
通过这样一个例子,总结下文件上传在servlet中的处理过程:
1. 实例化文件条目工厂 DiskFileItemFactory factory = new DiskFileItemFactory();
2. 实例化封装文件上传方法的高层API, ServletFileUpload upload = new ServletFileUpload(factory);
3. 获取要上传的位置path(这时候会通过server.xml读取配置文件);
4. 高层API对request进行解析,得到List<FileItem> list集合;
5. 迭代list,使用item.isFormField()方法判断该item是否问文件,如果是,则使用item.write(new File(path,fileName)),写入到指定目录。
好,使用servlet进行文件上传的大致流程就是如此。 如果你有任何疑问或者认为我有理解的不太的地方,欢迎各位同行批评指正,谢谢。
相关推荐
本文实例为大家分享了JSP+Servlet实现文件上传到服务器功能的具体代码,供大家参考,具体内容如下 项目目录结构大致如下: 正如我在上图红线画的三个东西:Dao、service、servlet 这三层是主要的结构,类似 MVC ...
Servlet中的文件操作,使用servlet上传下载文件的方式例题
主要介绍了servlet3文件上传操作的相关资料,需要的朋友可以参考下
实现web开发中的文件上传功能,需完成如下二步操作: 在web页面中添加上传输入项 在servlet中读取上传文件的数据,并保存到本地硬盘中。 如何在web页面中添加上传输入项? “file”>标签用于在web页面中添加文件上传...
本文实例讲述了servlet+JSP+mysql实现文件上传的方法。分享给大家供大家参考,具体如下: 一、文件上传的基本操作: 1、 表单属性enctype的设置 multipart/form-data和application/x-www-form-urlencoded的区别 FORM...
本文主要介绍了easyui使用filebox控件上传文件时遇到的问题以及解决方案,涉及到ajaxfileupload包的使用以及easyui和ajaxfileupload源码的修改。
从本地上传文件到HDFS上的代码!使用hadoop的API操作,使本地文件的代码上传到HDFS上!!!
主要介绍了简单操作实现Java jsp servlet文件上传过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
该案例通过FileUpload控件完成普通表单域和文件上传(单文件、多文件均可)混合操作,既能获取普通字段值,也上传成功。仅用于教学便于学生理解,代码难免有冗余,只提供为初学者参考,高手绕行!
由于存储空间,对一般用户而言,就是用来操作存储文件的,所以这两天,特意看了一下windows下用servlet实现文件上传、下载和删除,下面是详细代码说明 上传: 用的是commons-fileupload-1.2.2.jar和commons-io-...
小项目采用ajax java servlet jsp进行对文件进行上传下载操作处理的小软件,涉及技术比较旧,但可以作为参考
使用jquery/jsp/servlet/iframe实现跨浏览器跨全(子)域多文件上传操作.希望能给大家带来帮助.
本次文章解析了javaweb解决文件上传下载的问题,通过servlet服务结合js技术实现文件的操作。
项目已获导师指导并通过的95分的高分期末大作业项目,可作为课程设计...项目简介:本系统主要演示文件的单个上传、多文件上传到数据库里面、以及文件下载,通过此案例,你将JSP+Servlet技术掌握文件上传与下载的技能。
jsp+javabean+servlet+ajax,数据分页显示,使用SERVLET完成增删改查操作, 文件、图片上传,使用smartUpload组件完成上传操作。 MVC模式 非常适合初学者;
附件上传,servlet里代码操作,包括远程上传到服务器,处理表单的内容和上传文件。
第11章展示如何利用Servlet3的文件上传特性,以及如何在客户端改善用户的体验;第12章解释如何通过编程方式将资源发送到浏览器;第13章介绍如何利用Decorator模式以及类来改变Servlet请求和响应的行为;第14章讨论...
第11章展示如何利用Servlet 3的文件上传特性,以及如何在客户端改善用户的体验;第12章解释如何通过编程方式将资源发送到浏览器;第13章介绍如何利用Decorator模式以及类来改变Servlet请求和响应的行为;第14章讨论...
1、可以支持多个用户共同操作,主要功能包括文件上传、下载、删除、创建和删除文件夹。 2、用户登录系统后能够看到之前建立的文件夹,打开文件夹能够看到子文件夹和文件。 3、上传文件时可以让用户指定文件夹。 4、...