Servlet实现文件上传

一.组件准备

         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>

          如果有不足或者错误的地方,还请指出,不胜感激,愿你我共同进步。。。。

时间: 2024-10-29 21:52:37

Servlet实现文件上传的相关文章

java-我写的servlet将文件上传到WEB-INF目录下,修改了jsp后文件消失了,急求!

问题描述 我写的servlet将文件上传到WEB-INF目录下,修改了jsp后文件消失了,急求! 解决方案 修改JSP文件后,应该是重新生成了.把上传的路径找在其它地方看看

Servlet实现文件上传,可多文件上传示例_javascript技巧

一.Servlet实现文件上传,需要添加第三方提供的jar包 下载地址: 1) commons-fileupload-1.2.2-bin.zip:  点击打开链接 2)  commons-io-2.3-bin.zip:    点击打开链接  接着把这两个jar包放到 lib文件夹下: 二:文件上传的表单提交方式必须是POST方式, 编码类型:enctype="multipart/form-data",默认是 application/x-www-form-urlencoded 比如: &

com.css.common.upload.servlet关于文件上传的代码

package com.css.common.upload.servlet; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import

servlet+JSP+mysql实现文件上传的方法_JSP编程

本文实例讲述了servlet+JSP+mysql实现文件上传的方法.分享给大家供大家参考,具体如下: 一.文件上传的基本操作: 1. 表单属性enctype的设置 multipart/form-data和application/x-www-form-urlencoded的区别 FORM元素的enctype属性指定了表单数据向服务器提交时所采用的编码类型,默认的缺省值是"application/x-www-form-urlencoded". 然而,在向服务器发送大量的文本.包含非ASCI

JavaBean实现多文件上传的两种方法

上传 摘要:本文介绍了JavaBean实现多个文件上传的两种方法,分别是使用http协议和ftp协议实现.首先讲述了http协议传送多个文件的基本格式和实现上传的详细过程,之后简单介绍了使用ftpclient 类实现了ftp方式的上传,最后对这两种方法进行了比较. 关键字:JavaBean .http .ftp .ftpclient JavaBean是一种基于Java的软件组件.JSP对于在Web 应用中集成JavaBean组件提供了完善的支持.这种支持不仅能缩短开发时间(可以直接利用经测试和可

java基于servlet实现文件上传功能解析_java

最近项目需要做一个文件上传功能,做完了分享下,顺带当做笔记. 上传功能用后台用java实现,前端主要是js的ajax实现.后台还加入定时删除临时文件. 效果如图 首先是上传功能的主要类,下面是代码 package util.upload; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Iterat

class-servlet文件上传找不到ApplicationPart这个类

问题描述 servlet文件上传找不到ApplicationPart这个类 书里的servlet实现文件上传将Part强转成ApplicationPart,我按alt + / 找不到,求教 解决方案 org.apache.catalina.core.ApplicationPart;是这个类的全称,这个是apache的tomcate的某个jar,需要保证这个jar在类路径下才行呢. 解决方案二: 这个类不是系统类库中定义的,你看的是什么书,有没有配套源代码,或者解释说明.如果没有,建议换一本靠谱的

jsp多文件上传代码

JavaBean .http .ftp .ftpclient JavaBean是一种基于Java的软件组件.JSP对于在Web 应用中集成JavaBean组件提供了完善的支持.这种支持不仅能缩短开发时间(可以直接利用经测试和可信任的已有组件,避免了重复开发),也为JSP应用带来了更多的可伸缩性. 文件的上传功能在基于B/S的开发模式中非常普遍.同其他开发工具相比较,JSP对文件的上传支持并不是很完美,它既不象ASP那样一定需要使用组件来完成,也不像PHP那样直接提供了文件上载的支持.JSP实现文

Servlet中的上传下载文件

一.文件上传 文件的上传也是基于表单来完成的,表单中的file元素可以自动生成一个文本框和一个按钮,文本框可以输入本地文件名或路径,点击按钮则可以打开一个文件选择框让用户选中本地文件.需要注意的是在文件上传时还必须设置表单的enctype属性,并将它的值设置为multipart/form-data. upload.jsp   <FORM METHOD="POST" ENCTYPE="multipart/form-data"    ACTION="Sm