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

2023-11-14

目录

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>

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 前端面试大全(jQuery篇——含移动端常见问题)

    目录 面试系列 内容介绍 1 JQuery的源码看过吗 能不能简单概况一下它的实现原理 2 jQuery fn的init方法返回的this指的是什么对象 为什么要返回this 3 jquery中如何将数组转化为json字符串 然后再转化回来
  • harbor的https访问方式及自定义证书

    一 基本安装 docker docker compose 二 https访问harbor需要自定义证书 1 首先创建存放证书的目录 到对应目录证书的位置 root host1 harbor mkdir opt cert cd opt cer
  • matlab fminbnd 寻找区域极值

    fminbnd 进行有约束的一元函数最小值求解 它的求解命令是 X FMINBND FUN x1 x2 FUN 是目标函数 可以为表达式字符串或MATLAB自定义函数的函数柄 要求解在约束 x1 lt X lt x2下的最优解X 还有其他一
  • 干货丨什么是虚拟化技术?虚拟化常见架构

    在计算机中 虚拟化 英语 Virtualization 是一种资源管理技术 是将计算机的各种实体资源 如服务器 网络 内存及存储等 予以抽象 转换后呈现出来 打破实体结构间的不可切割的障碍 使用户可以比原本的组态更好的方式来应用这些资源 这
  • STM32固件库(标准外设库)入门学习 第六章TIM定时器(二)

    STM32固件库 标准外设库 入门学习 第六章TIM定时器 二 文章目录 STM32固件库 标准外设库 入门学习 第六章TIM定时器 二 前言 一 定时中断代码 1接线图 2 程序编写 2 1 第一步开启RCC时钟 2 2 第二步选择时基单
  • 大数据应用期末总评

    本作业来自于 https edu cnblogs com campus gzcc GZCC 16SE1 homework 3363 一 将爬虫大作业产生的csv文件上传到HDFS 将爬虫大作业中爬取到的数据文件csv导入到 usr loca
  • 前端API接口的调用

    一 开启API接口 首先我们把模型部署在自己的服务器上之后开启模型的接口 linux环境下 进入模型文件 输入命令行 bash webui sh listen api 实现api接口的开启 我们获得一个api接口的地址 二 API接口调用并
  • Springboot的部分依赖及作用

    SpringBoot2使用Undertow来提高应用性能 spring boot starter undertow
  • 【Linux】---文件基础I/O

    文章目录 回顾C语言文件操作接口 文件相关的系统调用接口 打开和关闭文件 文件的打开方式 文件描述符 文件描述符的分配规则 write read 重定向 dup2 mysell 回顾C语言文件操作接口 在C语言中对于文件的操作有着几个常用的
  • retinaface人脸对齐

    yolov5 face 人脸对齐 yolov5 face align rar 深度学习文档类资源 CSDN下载 GitHub foamliu MobileFaceNet PyTorch PyTorch implementation of M
  • 高等数学教材啃书汇总重难点(三)微分中值定理与导数的应用

    本章节包含多个知识点 一些列微分中值定理是考研证明题的重头戏 而洛必达和泰勒展开则是方法论的天花板难度 虽然对于小题的考察难度较低 整体上仍需重点复习 1 费马引理 2 罗尔定理 3 拉格朗日定理 4 柯西中值定理 5 洛必达法则 6 泰勒
  • 求一个4*4矩阵两对角线元素之和 设计一个程序

    提示你一下 但是只应该加一次 中间行的对角线元素重叠 由于当n是奇数的时候 每行上对角线元素的序号相加是n 1 对角线的元素在每行上的分布是规律的 共n行 不过思想是从行出发 矩阵由数组array n n 表示for int i 0 i
  • 用C语言解“计算工资”题

    7 10 计算工资 某公司员工的工资计算方法如下 一周内工作时间不超过40小时 按正常工作时间计酬 超出40小时的工作时间部分 按正常工作时间报酬的1 5倍计酬 员工按进公司时间分为新职工和老职工 进公司不少于5年的员工为老职工 5年以下的
  • Vue3全局提示(Message)

    Vue2全局提示 Message 可自定义设置以下属性 自动关闭的延时 duration 类型 number 单位ms 默认 3000ms 消息距离顶部的位置 top 类型 number 单位px 默认 30px 调用一次只展示一个提示 调
  • datax源码解析-任务拆分机制详解

    datax源码解析 任务拆分机制详解 写在前面 此次源码分析的版本是3 0 因为插件是datax重要的组成部分 源码分析过程中会涉及到插件部分的源码 为了保持一致性 插件都已大部分人比较熟悉的mysql为例子说明 本文我们来看看datax的
  • [云原生专题-22]:K8S - 集群编排工具K8S与SWARM比较与技术选择

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122750196 目录 前言 第1章
  • Tomcat安装及IDEA配置Tomcat教程

    Tomcat安装 以Tomcat8 5为例 1 网站链接 Apache Tomcat Apache Tomcat 8 Software Downloads 根据个人喜好 我安装的是8 5版本 2 下载完解压即可 我的安装目录为 E Envi
  • R语言入门(一)

    R语言入门 一 在vscode中使用R语言注意事项 按照其他教程安装配置插件 使用run source运行r代码 使用run code 会报错 原因未知 生成正态分布的点数据 import pandas as pd import numpy
  • win7+ VS2010安装CUDA7.0图文说明

    win7 VS2010安装CUDA7 0图文说明 1 查看本机配置 查看显卡类型是否支持NVIDIA GPU 选中计算机 gt 右键属性 gt 设备管理器 gt 显示适配器 NVIDIA GeForce GT 610 从https deve
  • Servlet 基础知识(4)(利用Servlet实现文件上传功能)

    目录 1 DiskFileUpload 类 1 setSizeMax 方法 2 setSizeThreshold 方法 3 setRepositoryPath 方法 4 parseRequest HttpServletRequest req