Javaweb基础入门(十六)之文件的上传

1.文件上传的必要条件

1.form表单 属性 enctype=”multipart/form-data”
注意:当表单enctype属性 设置为”multipart/form-data”的时候 getParameter…方法将会失效
解释:服务器获取数据 getParameter(String name)方法 获取指定name 的字符内容 但文件上传 表单已经不再是 字符内容 而是字节内容
2.form表单 method提交方式必须是post
3.提供 input type=”file” 上传输入框

2.实现文件上传功能

fileupload 是由apache 的 commons组件提供的 主要工作就是帮我们解析 request.getInputStream()
实现步骤:
1.导入jar包 两个包 commons-fileupload-1.2.2 commons-io-2.2
2.fileUpload的核心类

类名 解释
DiskFileItemFactory 创建工厂对象
ServletFileUpload 使用工厂 创建 解析器对象
FileItem 使用解析器 来解析request对象 可以获取普通标签 和 上传标签

3.方法

方法 作用
boolean isFormFiled() 判断当前的表单标签是否是普通标签 如果返回 true 说明是普通标签 如果返回 false 说明是文件上传标签
String getFieldName() 获取标签名
String getString() 获取值
String getName() 获取上传域中添加的文件路径(绝对路径)
void write(File) 把上传的文件 保存到指定文件中

4.文件上传需要注意的几个问题:

A:限制文件大小 为了项目的安全性考虑 设置文件的大小限制

设置单个文件的大小 ServletFileUpload.setFileSizeMax()
设置文件上传的总大小ServletFileUpload.setSizeMax()

B.设置临时文件

如果上传的文件比较大 会产生一个临时文件 当文件上传成功 临时文件会被清理 DiskFileFactory.setRepository(设置临时文件存储位置)
注意:不要设置在系统盘 一般情况 系统盘都有保护
临时文件: 相当于是缓存 缓存的小是10kb 如果上传的文件超过10kb 就会出现临时文件 缓存数据

C.判断表单是否支持文件上传

判断表单是否设置了 enctype enctype必须是 multipart/form-data
ServletFileUpload isMultipartContent(request)

D.避免文件被覆盖 重名现象 文件名重组 加上 UUID
E.避免同一个文件夹中文件过多 打散目录

方案1 按照日期 进行打散存储 当前日期/fileName
方案2 按照文件名 获取哈希值 转成16进制 创建文件夹

F.解决中文乱码问题

1.上传框中中文乱码 ServletFileUpload setHeaderEncoding("编码集")
2.解决普通文本框中的乱码 FileItem getString("编码集")

G.判断上传字段 是否有值
H.截取文件名方式

截取文件名 第一种
fileName = fileName.substring(fileName.lastIndexOf("\\")+1);
截取文件名 第二种
fileName = FilenameUtils.getName(fileName);

I.文件存储路径映射
将文件存储在服务器硬盘上的绝对路径 无法通过浏览器访问?

在tomcat/conf/service.xml文件中<Host>标签
其中 docBase 表示硬盘上的地址 path=”/web09_upload” 表示访问地址

<Context docBase="web09_upload" path="/web09_upload" reloadable="true" source="org.eclipse.jst.jee.server:web09_upload"/>
<Context docBase="硬盘绝对路径" path="/访问地址" reloadable="true"/>

猜你喜欢

转载自blog.csdn.net/xueer_z/article/details/82463143