Servlet 基础知识(4)(利用Servlet实现文件上传功能)

目录

1.DiskFileUpload 类

1)setSizeMax()方法

2) setSizeThreshold()方法

3) setRepositoryPath()方法

4) parseRequest(HttpServletRequest req)方法

5) isMultipartContent()方法

6) setHeaderEncoding()方法

2.FileItem 类

1) isFormField()方法

2) getName()方法

3) getFieldName()方法

4) write()方法

5) getString()方法

6) getContentType()方法

7) isInMemory()方法

8) delete()方法

3、项目实现


1.DiskFileUpload 类

DiskFileUpload 类是 Apache 文件上传组件的核心类。

1)setSizeMax()方法

setSizeMax()方法用于设置允许浏览器上传文件的大小限值,以防止客户端故意通过上传特大的文件来塞满服务器端的存储空间,单位为字节如果请求消息中的实体内容的大小超过了 setSizeMax()方法的设置值,该方法将会抛出 FileUploadException 异常。。其完整语法定义如下:
public void setSizeMax(long sizeMax)

2) setSizeThreshold()方法

Apache 文件上传组件在解析和处理上传内容时,需要临时保存解析出的数据。因为Java 虚拟机默认可以使用的内存空间是有限的(一般不大于 100M),超出限制时将会发生
“java.lang.OutOfMemoryError”错误,如果上传的文件很大,例如上传 800M 的文件,在内存中将无法保存该文件内容
,该方法传入的参数的单位是字节。
public void setSizeThreshold(int sizeThreshold)//上面方法的集合

3) setRepositoryPath()方法

setRepositoryPath()方法用于设置 setSizeThreshold 方法中提到的临时文件的存
放目录,这里要求使用绝对路径。
public void setRepositoryPath(String repositoryPath)
如果不设置存放路径,那么临时文件将被储存在 java.io.tmpdir 这个 JVM 环境属性所指定的目录中,tomcat 将这个属性设置为了“{tomcat 安装目录}/temp/”目录。

4) parseRequest(HttpServletRequest req)方法

这是 DiskFileUpload 类的重要方法,它对 HTTP 请求消息进行解析,如果请求消息中的实体内容的类型不是“multipart/form-data”,该方法将抛出 FileUploadException异常。parseRequest()方法解析出 FORM 表单中的每个字段的数据,并将它们分别包装成独立的 FileItem 对象,然后将这些 FileItem 对象加入进一个 List 类型的集合对象中返回。
public List parseRequest(HttpServletRequest req)
parseRequest(HttpServletRequest req, int sizeThreshold, long sizeMax, String path)

5) isMultipartContent()方法

用于判断请求中的内容是否是“multipart/form—data”类型,是则返回 true,否则返回 false。isMultipartContent()方法是一个静态方法,不用创建 DiskFileUpload 类的实例对象即可被调用,其完整语法定义如下:

public static final boolean isMultipartContent(HttpServletRequest req)

6) setHeaderEncoding()方法

对于浏览器上传给 WEB 服务器的各个表单字段的描述头内容,Apache 文件上传组件都需要将它们转换成字符串形式返回,setHeaderEncoding 方法用于设置转换时所使用的字符集编码。
public void setHeaderEncoding(String encoding)

2.FileItem 类

FileItem 是一个接口,在应用程序中使用的实际上是该接口一个实现类,该实现类 的名称并不重要,程序可以采用 FileItem 接口类型来对它进行引用和访问,为了便于讲解,这里将 FileItem 实现类称之为 FileItem 类。FileItem 类用来封装单个表单字段元 素的数据,一个表单字段元素对应一个 FileItem 对象,通过调用 FileItem 对象的方法可以获得相关表单字段元素的数据。

1) isFormField()方法

isFormField()方法用于判断 FileItem 类对象封装的数据是否属于一个普通表单字段,还是属于一个文件表单字段,如果是普通表单字段则返回 true,否则返回 false。
public boolean isFormField()

2) getName()方法

getName()方法用于获得文件上传字段中的文件名。如果 FileItem 类对象对应的是普通表单字段,getName()方法将返回 null。
public String getName()

3) getFieldName()方法

getFieldName()方法用于返回表单字段元素的 name 属性值,也就是返回各个描述头部分中的 name 属性值。
public String getFieldName()

4) write()方法

write()方法用于将 FileItem 对象中保存的主体内容保存到某个指定的文件中。主要用途是将上传的文件内容保存在本地文件系统中。

public void write(File file)

5) getString()方法

getString()方法用于将 FileItem 对象中保存的主体内容作为一个字符串返回,它有两个重载的定义形式
public java.lang.String getString() 
public java.lang.String getString(java.lang.String encoding)

6) getContentType()方法

getContentType()方法用于获得上传文件的类型。如果 FileItem 类对象对应的是普通表单字段,该方法将返回 null。
public String getContentType()

7) isInMemory()方法

isInMemory()方法用来判断 FileItem 类对象封装的主体内容是存储在内存中,还是存储在临时文件中,如果存储在内存中则返回 true,否则返回 false。
public boolean isInMemory()

8) delete()方法

delete()方法用来清空 FileItem 类对象中存放的主体内容,如果主体内容被保存在临时文件中,delete 方法将删除该临时文件。
public void delete()

3、项目实现

package servlettest; 
import java.io.File; 
import java.io.IOException; 
import java.io.PrintWriter; 
import java.util.Iterator; 
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.DiskFileUpload; 
import org.apache.commons.fileupload.FileItem; 
import org.apache.commons.fileupload.FileUploadException; 
public class FileUploadServlet extends HttpServlet { 
 public FileUploadServlet() { 
 super(); 
 } 
 public void destroy() { 
 super.destroy(); 
 } 
 public void doGet(HttpServletRequest request, HttpServletResponse response) 
 throws ServletException, IOException { 
 response.setContentType("text/html;charset=utf-8"); 
 PrintWriter out = response.getWriter(); 
 //设置保存上传文件的目录 
 String uploadDir = "d:/upfile"; //文件上传后的保存路径 
 out.println("上传文件存储目录!"+uploadDir); 
 File fUploadDir = new File(uploadDir); 
 if(!fUploadDir.exists()){ 
 if(!fUploadDir.mkdir()){ 
 out.println("无法创建存储目录 d:/upfile!"); 
 return; 
 } 
 } 
 if (!DiskFileUpload.isMultipartContent(request)){ 
 out.println("只能处理 multipart/form-data 类型的数据!"); 
 return; 
 } 
 DiskFileUpload fu = new DiskFileUpload(); 
 fu.setSizeMax(1024*1024*200);//最多上传 200M 数据 
 fu.setSizeThreshold(1024*1024);//超过 1M 的数据采用临时文件缓存
//fu.setRepositoryPath(...); //设置临时文件存储位置(如不设置,则采用默认位置) 
 fu.setHeaderEncoding("utf-8");//设置上传的文件字段的文件名所用的字符集编码 
 List fileItems = null;//创建文件集合,用于保存浏览器表单传来的文件 
 try 
 { 
 fileItems = fu.parseRequest(request); 
 } 
 catch(FileUploadException e) 
 { 
 out.println("解析数据时出现如下问题:"); 
 e.printStackTrace(out); 
 return; 
 } 
 //下面通过迭代器逐个将集合中的文件取出,保存到服务器上 
 Iterator it = fileItems.iterator(); //创建迭代器对象 it 
 while (it.hasNext()) 
 { 
 FileItem fitem = (FileItem) it.next(); //由迭代器取出文件项 
 if (!fitem.isFormField()) //忽略其他不属于文件域的那些表单信息 
 try{ 
 String pathSrc = fitem.getName(); 
//文件名为空的文件项不处理 
 if(pathSrc.trim().equals(""))continue; 
//确定最后的"\"位置,以此获取不含路径的文件名 
 int start = pathSrc.lastIndexOf('\\'); 
//获取不含路径的文件名 
 String fileName = pathSrc.substring(start + 1); 
 File pathDest = new File(uploadDir, fileName); //构建目标文件对象 
 fitem.write(pathDest); //将文件保存到服务器上 
 } 
 catch (Exception e) 
 { 
 out.println("存储文件时出现如下问题:"); 
 e.printStackTrace(out); 
 return; 
 } 
 finally //总是立即删除保存表单字段内容的临时文件 
 { 
 fitem.delete(); 
 } 
 } 
 response.sendRedirect("../test/fileupload_list.jsp"); 
 } 
 public void doPost(HttpServletRequest request, HttpServletResponse response) 
 throws ServletException, IOException{ 
 doGet(request,response); 
 } 
 public void init() throws ServletException { 
 } 
}
<servlet> 
 <servlet-name>FileUploadServlet</servlet-name> 
 <servlet-class>servlettest.FileUploadServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
 <servlet-name>FileUploadServlet</servlet-name> 
 <url-pattern>/servlet/FileUploadServlet</url-pattern> 
 </servlet-mapping>
<%@ page language="java"%> 
<%@ page contentType="text/html;charset=gb2312"%> 
<html> 
<head><title>文件上传</title></head> 
<body bgcolor="#FFFFFF" text="#000000" leftmargin="0" topmargin="40" 
 marginwidth="0" marginheight="0"> 
 <center><h1>文件上传</h1> 
 <form name="uploadform" method="POST" action="..\servlet\FileUploadServlet" 
 ENCTYPE="multipart/form-data"> 
 <table border="3" width="450" cellpadding="4" 
cellspacing="2" bordercolor="#9BD7FF"> 
 <tr> <td colspan="2"> 
 文件 1:<input type="file" name="file1" size="40"></td></tr> 
 <tr> <td colspan="2"> 
 文件 2:<input type="file" name="file2" size="40"></td></tr> 
 <tr> <td colspan="2"> 
 文件 3:<input type="file" name="file3" size="40"></td></tr> 
 </table><br><br> 
 <table> 
 <tr> <td ALIGN=“CENTER”> 
 <input type="submit" name="submit" value="开始上传"/></td></tr> 
 </table> 
 </form></center> 
 </body> 
</html>
<%@ page contentType="text/html; charset=GB2312" import="java.io.*" %> 
<html> 
<head> <title>文件目录</title></head> 
<body> 
<font size=4 color=red>已上传的文件目录列表</font><br> 
<font size=5 color=blue> 
<%
String path = "d: /upfile"; 
 File fl = new File(path); 
 File filelist[] = fl.listFiles(); 
 out.println("服务器上上传文件的保存路径:"+path+"<br><br>"); 
 for(int i=0; i < filelist.length; i++) 
 { 
 out.println((i+1)+":"+filelist[i].getName()+"&nbsp;&nbsp;<br>"); 
 //如果是图片文件,可用以下语句显示图片。 
 //out.println("<img src=images\\"+filelist[i].getName()+"><br><br>"); 
 } 
%> 
</body> 
</html>

 

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小郭同学忒骚了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值