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"/>