文件上传

来源:互联网 发布:c语言黑客编程pdf 编辑:程序博客网 时间:2024/05/29 15:14
 

文件上传

一、文件上传概述

1、如何在Servlet中读取文件上传数据,并保存到本地硬盘中?

Request对象提供了一个getInputStream方法,通过这个方法可以读取到客户端提交过来的数据。但由于用户可能会同时上传多个文件,在servlet端编程直接读取上传数据,并分别解析出相应的文件数据是一项非常麻烦的工作,示例。

为方便用户处理文件上传数据,Apache 开源组织提供了一个用来处理表单文件上传的一个开源组件( Commons-fileupload ),该组件性能优异,并且其API使用极其简单,可以让开发人员轻松实现web文件上传功能,因此在web开发中实现文件上传功能,通常使用Commons-fileupload组件实现。

2、使用Commons-fileupload组件实现文件上传,需要导入该组件相应的支撑jar包:Commons-fileupload和commons-io。commons-io 不属于文件上传组件的开发jar文件,但Commons-fileupload 组件从1.1 版本开始,它工作时需要commons-io包的支持。

二、fileupload组件工作流程

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

IE浏览器

上传文件1

上传文件1

普通字段

 

 

 

 

 

 

 

 

 

WEB服务器

request

ServletFileupLoad

DiskFileItemFactory

代表普通字段的

FileItem

代表上传文件1

FileItem

代表上传文件2

FileItem

isFormField

getFieldName

getString

getInputStream

getName

getInputStream

getName

 

三、核心API—DiskFileItemFactory

1、DiskFileItemFactory 是创建 FileItem 对象的工厂,这个工厂类常用方法:

a) public void setSizeThreshold(int sizeThreshold) :设置内存缓冲区的大小,默认值为10K。当上传文件大于缓冲区大小时,fileupload组件将使用临时文件缓存上传文件。

b)public void setRepository(java.io.File repository) :指定临时文件目录,默认值为System.getProperty("java.io.tmpdir").

c)public DiskFileItemFactory(int sizeThreshold, java.io.File repository) :构造函数

2、ServletFileUpload 负责处理上传的文件数据,并将表单中每个输入项封装成一个 FileItem 对象中。常用方法有:

a)         boolean isMultipartContent(HttpServletRequest request) :判断上传表单是否为multipart/form-data类型

b)        List parseRequest(HttpServletRequest request):解析request对象,并把表单中的每一个输入项包装成一个fileItem 对象,并返回一个保存了所有FileItem的list集合。

c)        setFileSizeMax(long fileSizeMax) :设置上传文件的最大值

d)        setSizeMax(long sizeMax) :设置上传文件总量的最大值

e)         setHeaderEncoding(java.lang.String encoding) :设置编码格式

f)         setProgressListener(ProgressListener pListener)

四、上传文件的处理细节(1)

1、中文文件乱码问题

文件名中文乱码问题,可调用ServletUpLoader的setHeaderEncoding方法,或者设置request的setCharacterEncoding属性

(1)上传文件的中文乱码   upload.setHeader

(2)普通输入项的乱码问题            

手工方式:inputValue=new String(inputValue.getBytes("ISO8859-1"),"utf-8");

               String inputValue=item.getString("utf-8");

(3)防止用户不在文件上传的输入项输入上传文件   

if(filename.trim().equale(“”)){

        //读取上传文件的内容,并存入本地磁盘

}

2、临时文件的删除问题

a)由于文件大小超出DiskFileItemFactory.setSizeThreshold方法设置的内存缓冲区的大小时,Commons-fileupload组件将使用临时文件保存上传数据,因此在程序结束时,务必调用FileItem.delete方法删除临时文件。

b)Delete方法的调用必须位于流关闭之后,否则会出现文件占用,而导致删除失败的情况。

(1)临时文件的删除

factory.setRepository(new File(this.getServletContext().get

...

is.close();

fos.close();

item.delete();

(2)上传文件的保存位置:服务的安全性

WEB-INF文件夹下的子文件夹中    或者不受服务器管理的目录

(3)多个用户上传了同名的文件,这时后面的人上传的文件就会覆盖

唯一文件名,解决办法UUID.randomUUID().toSting()

Filename=UUID.randomUUID().toString()+”_”+filename;

(4)在同一个文件夹放置文件过多。

按日期来存   2011-11-24      upload下:365个子文件夹

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 扣扣转账转错了怎么办 到付快递签收了怎么办 京东白条消费了怎么办 确认收货点错了怎么办 小米6后盖缝隙大怎么办 苹果6splus电池不耐用怎么办 苹果一朵云加箭头下载不了怎么办 苹果8p信号不好怎么办 苹果8p像素不好怎么办 美版iphonex有锁怎么办 苹果8x突然黑屏怎么办 苹果6s无法激活怎么办 苹果6sp激活出错怎么办 小米4c触屏失灵怎么办 手机谷歌浏览器为什么打不开怎么办 谷歌浏览器打不开网址怎么办 拼多多被限制了怎么办 保时捷11年的前机盖打不开怎么办 唯品会衣服质量有问题怎么办 唯品会买的东西有质量问题怎么办 唯品会上卖到假东西怎么办 个人资金链断了怎么办 腾讯财理通平台倒闭投资者该怎么办 ebay买到假货了怎么办 善心汇会员被限制出行怎么办 苹果手机屏碎了怎么办 三国志2017仓库满了怎么办 至尊宝密保手机被改了怎么办 电脑版qq游戏途中死机怎么办 登陆企业qq服务器超时怎么办 qq登录不上怎么办错误00001 苹果手机白屏进不了界面怎么办 苹果8p手机白屏怎么办 苹果5s无法关机怎么办 三星手机白屏了怎么办 电脑能上qq打不开网页怎么办? 电脑打不开机怎么办黑屏 英雄杀连接不上怎么办 炫舞时登陆器卸下载失败怎么办 电视为什么会出现登录超时怎么办 登录app时提示请求超时怎么办