文件上传的基本条件和步骤:
文件上传的基本条件:
1.必须提供form表单
2.form表单的请求方式为post
3.form表单的enctype属性值必须为multipart/form-data
4.提供input的file类型标签
5.必备文件上传的jar包和其依赖包
文件上传思路步骤:
1.获取工厂DiskFileItemFactory
2.通过工厂获取文件上传核心类ServletFileUpload
3.解析表单数据,得到多个表单项对象FileItem
4.通过FileItem对象获取表单项的值并做相应的处理
文件上传的相应类和方法:
核心类ServletFileUpload:
setHeaderEncoding(String charset) :解决中文文件名乱码问题
setSizeMax(long size):设置表单的上传大小的限制
setFileSizeMax(long size):设置表单单个文件上传大小的限制
ListItem类:
getString():获取表单数据的文本信息
getString(String charset):获取表单数据的文本信息,指定解码方式
getFileName():获取表单项的属性名称
getName():获取上传文件的文件名称
delete():表示删除临时文件(小的临时文件)
write(File file):把上传的文件写入到指定的文件中
文件上传的细节问题
浏览器版本不同的问题解决方案:
当浏览器版本不同getFileName的方法获取的文件名将会不同,因此需要对文件名进行处理。
1、 先获取获取的文件名最后一次出现"\"的位置(脚标)
2、 从获取的脚标值加1位置开始截取,一直到结束
以上两步就可解决浏览器版本问题
文件名同名问题解决方案:
当上传文件的文件名出现重复时,后一个文件会覆盖前一个文件,这样会造成数据的丢失和被更改
1、 以"."截取文件的扩展名
2、 将原有的文件名改为uuid,然后拼接文件扩展名,形成一个新的唯一的文件名
文件上传的目录打散和缓冲设置
目录打散:
存在的问题:单个文件目录中不能保存过多的数据。
解决方案:目录打散,使得所有的文件分散到不同的目录中
步骤:1、 使用原始文件名获取该文件名的int类型hashCode值
2、 将int类型的hashCode值转为16进制值
3、 取16进制值的前两位作为两层目录和项目中存储上传文件的目录进行拼接
4、 然后调用File类的mkdirs方法,创建出多层目录
5、 将上传的文件存储到最后一层目录下
存在的问题:由于内存有限,当上传大文件的时候,全部读取到内存中是不可取的
解决方案:设置内存中存储的临时文件的大小,当大于该值的时候,将文件放置到缓冲目录下,等上传完毕,一次性写入到目标目录下
步骤:在创建工厂的时候使用有参的构造方法即可
DiskFileItemFactory(int size,File res):size表示内存最大存储数据大小,当超过该设定值时,将会把内存中的数据写到临时目录下,res表示指定的临时目录