Servlet实现文件上传
2013-11-20 10:00
288 查看
一.组件准备 Servlet实现文件上传,需要添加第三方提供的jar包 commons-fileupload-1.2.2-bin.zip commons-io-2.3-bin.zip 在http://commons.apache.org/downloads/index.html找,然后放在如下目录下 文件上传的表单提交方式必须是POST方式, 编码类型:enctype="multipart/form-data",默认是 application/x-www-form-urlencoded文件上传 具体步骤:* 1)获得磁盘文件条目工厂 DiskFileItemFactory 要导包* 2) 利用 request 获取 真实路径 ,供临时文件存储,和 最终文件存储 ,这两个存储位置可不同,也可相同* 3)对 DiskFileItemFactory 对象设置一些 属性* 4)高水平的API文件上传处理 ServletFileUpload upload = new ServletFileUpload(factory); 目的是调用 parseRequest(request)方法 获得 FileItem 集合list (一次上传多个文件,意思是多个input file)* 5)在 FileItem 对象中 获取信息, 遍历, 判断 表单提交过来的信息 是否是 普通文本信息 另做处理* 6)* 第一种. 用第三方 提供的 item.write( new File(path,filename) ); 直接写到磁盘上* 第二种. 手动处理 二.理论准备 base标签只能放置在head标签内,只有href和target,所有浏览器都支持head标签,里面的title是唯一必须的。<base> 标签为页面上的所有链接规定默认地址或默认目标。通常情况下,浏览器会从当前文档的 URL 中提取相应的元素来填写相对 URL 中的空白。使用 <base> 标签可以改变这一点。浏览器随后将不再使用当前文档的 URL,而使用指定的基本 URL 来解析所有的相对 URL。这其中包括 <a>、<img>、<link>、<form> 标签中的 URL。
<html>
<head>
<base href="http://www.w3school.com.cn/i/" />
<base target="_blank" />
</head>
<body>
<img src="eg_smile.gif" /><br />
<p>请注意,我们已经为图像规定了一个相对地址。由于我们已经在 head 部分规定了一个基准 URL,浏览器将在如下地址寻找图片:</p>
<p>"http://www.w3school.com.cn/i/eg_smile.gif"</p>
<br /><br />
<p><a href="http://www.w3school.com.cn">W3School</a></p>
<p>请注意,链接会在新窗口中打开,即使链接中没有 target="_blank" 属性。这是因为 base 元素的 target 属性已经被设置为 "_blank" 了。</p>
</body>
</html>三.代码实现
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//得到项目的名字,如果项目为根目录,则得到一个"",即空的字条串
String path = request.getContextPath();
//scheme:http
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<!--
所有浏览器都支持head标签,里面的title是唯一必须的。
<base> 标签为页面上的所有链接规定默认地址或默认目标。
通常情况下,浏览器会从当前文档的 URL 中提取相应的元素来填写相对 URL 中的空白。
使用 <base> 标签可以改变这一点。浏览器随后将不再使用当前文档的 URL,而使用指定的基本 URL 来解析所有的相对 URL。
这其中包括 <a>、<img>、<link>、<form> 标签中的 URL。
-->
<base href="<%=basePath%>">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>文件上传</title>
</head>
<body>
<form action="2.jsp" method="post" enctype="multipart/form-data">
<label>文件:<input type="file" name="myFile">
</label><br /> <label>其他信息:<input type="text" name="info" /></label><br /> <input
type="submit" value="提交" />
</form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="org.apache.commons.fileupload.servlet.*" %>
<%@page import="org.apache.commons.fileupload.*" %>
<%@page import="org.apache.commons.fileupload.disk.*" %>
<%@page import="java.util.List" %>
<%@page import="java.util.Iterator" %>
<%@page import="java.io.*" %>
<%
//Check that we have a file upload request
//监测request中是否包含文件
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if(isMultipart){
out.print("包含文件");
}else{
out.print("不包含文件");
}
out.print("<br/>");
// Create a factory for disk-based file items
FileItemFactory factory = new DiskFileItemFactory();
//获取文件需要上传到的路径
// String path = request.getRealPath("/upload");
String path = session.getServletContext().getRealPath("upload");
//如果没以下两行设置的话,上传大的 文件 会占用 很多内存,
//设置暂时存放的 存储室 , 这个存储室,可以和 最终存储文件 的目录不同
/**
* 原理 它是先存到 暂时存储室,然后在真正写到 对应目录的硬盘上,
* 按理来说 当上传一个文件时,其实是上传了两份,第一个是以 .tem 格式的
* 然后再将其真正写到 对应目录的硬盘上
*/
// factory.setRepository(new File(path));
//设置 缓存的大小,当上传文件的容量超过该缓存时,直接放到 暂时存储室
// factory.setSizeThreshold(1024*1024) ;
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// Parse the request
List items = upload.parseRequest(request);
// Process the uploaded items
Iterator iter = items.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
if (item.isFormField()) {//如果是普通表单控件
////获取表单的属性名字
String name = item.getFieldName();
//获取用户具体输入的字符串 ,名字起得挺好,因为表单提交过来的是 字符串类型的
String value = item.getString();
request.setAttribute(name,value);
out.print("name:"+name +"<br/>");
out.print("value:"+value +"<br/>");
} else {//如果是文件
//也叫name是为了和上面保持一致,方便显示页面
String name = item.getFieldName();
String fileName = item.getName();
String contentType = item.getContentType();
boolean isInMemory = item.isInMemory();
long sizeInBytes = item.getSize();
out.print("表单文件控件名:"+name +"<br/>");
//绝对路径的
out.print("上传文件名:"+fileName +"<br/>");
out.print("文件类型:"+contentType +"<br/>");
out.print("是否保存在内存中:"+isInMemory +"<br/>");
out.print("大小:"+sizeInBytes +"字节<br/>");
//上传文件
//获取文件名
String f_name = fileName.substring(fileName.lastIndexOf("\\")+1,fileName.length());
request.setAttribute(name,f_name);
// 进行文件上传
File uploadedFile = new File(path ,f_name);
item.write(uploadedFile);
/* OutputStream out = new FileOutputStream(new File(path,filename));
InputStream in = item.getInputStream() ;
int length = 0 ;
byte [] buf = new byte[1024] ;
System.out.println("获取上传文件的总共的容量:"+item.getSize());
// in.read(buf) 每次读到的数据存放在 buf 数组中
while( (length = in.read(buf) ) != -1)
{
//在 buf 数组中 取出数据 写到 (输出流)磁盘上
out.write(buf, 0, length);
}
in.close();
*/
}
}
request.getRequestDispatcher("showFile.jsp").forward(request, response);
%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>文件展示</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
用户名:${requestScope.usename } <br/>
文件:${requestScope.myfile }<br/>
<!-- 把上传的图片显示出来-->
<img alt="go" src="upload/<%=(String)request.getAttribute("myfile")%> " />
</body>
</html>如果有不足或者错误的地方,还请指出,不胜感激,愿你我共同进步。。。。
相关文章推荐
- /MD, /MDD, /ML, /MT,/MTD(使用运行时库)
- tomcat 内存设置
- Variational Bayes
- 2013年读的书(很多还没看完)
- 使用 WebSockets 的 9 个应用场景
- Silverlight读取Zip文件中的图片与视频
- vmware player加载virtualbox安装好的虚拟ubuntu
- sphinx 增量索引 及时更新、sphinx indexer索引合成时去旧和过滤办法(转)
- jquery datatable分页配置
- 移动应用数据如何提升用户体验
- Python的系统管理_02python和Ipython数据类型
- Atlassian Confluence安装以及如何更改数据库
- 查看系统块大小
- 用户的世界-搜索解密营销-百度-夏海
- 产品经理反省清单
- google play 支付时提示:系统判定您的订单存在较高的风险 的解决办法
- 如何搭建远程Repo服务器端 .
- LINUX守护进程介绍
- Install Apache, Php, Mysql, Symfony on Fedora
- 天天动听 悬浮歌词(迷你歌词)效果解读