声明:此次讲解文件上传使用的FileUpload组件和IO组件,都是Apache官网最新版,FileUpload版本号:commons-fileupload-1.3.1-bin.zip,IO版本号:commons-io-2.4-bin.zip。使用其他版本如有问题可以问我。
一、学习案例:本来这章是要讲解struts2的文件上传的,但是考虑我写博文的目的,是让大家从底层学习知识点,而struts2文件上传都是对servlet底层的一些封装,所以还是有必要讲解下servlet文件上传。
二、案例分析:实现文件上传所遵循的步骤:
a)DiskFileItemFactory(磁盘文件条目的工厂),通过文档,我们可以了解到它实现了FileItemFactory。我们首先生成其实例,并设置各种属性。
1、获取存放文件真实路径
String path = req.getRealPath("/upload");
2、设置临时文件存放路径
factory.setRepository(new File(path));
3、文件溢出大小为1024*1024才直接写向磁盘,此处配置既是防止直接写向磁盘文件溢出大小为1024*1024才直接写向磁盘,此处配置既是防止直接写向磁盘
factory.setSizeThreshold(1024 * 1024);
b)ServletFileUpload,通过文档我们可以发现它的构造方法需要一个FileItemFactory的一个实例。设置过后,我们就可以使用ServletFileUpload的各种方法。
c)ServletFileUpload一个重要的步骤就是解析请求。通过文档我们可以看到它有一个parseRequest(javax.servlet.http.HttpServletRequest request) throws FileUploadException,它返回的List泛型对象,每个就是一个FileItem对象。
d)FileItem(磁盘文件条目),我们就是通过它对请求对象进行处理
1、首先判断当前item是简单的表单文本域还是文件
isFormField()
2、文本域获取,因为form表单中指定了enctype=”multipart/form-data”,所以我们要通过FileItem提供的方法获取
String name = item.getFieldName();获取文本框名称
String value = item.getString();获取文本框输入值
3、文件名获取
String name = item.getFieldName();获取文本框名称
String value = item.getName();获取上传文件名
因为浏览器的不同,例如:Opera browser,会获取路径+文件名,所以我们要去除路径。
4、文件上传,我们可以通过FileItem的方法直接写出,也可通过IO流写入。
item.write(new File(path, fileName));
三、经验之谈:
a)Apache基金会,我不知道它对于其他语言的作用,但是对我们web,特别是jsp开发人员来讲,属于殿堂级的网站,里面有很多开源的插件,很是值得我们学习和利用。关于struts2的维护和升级文档都可以在上面看到。大家没事可以多溜达下。
b)不要背代码,要理清思路。比如:实现文件上传,我们只需要理解它的思路,就能很快实现出来。
四、参考项目:http://download.csdn.net/detail/u011638419/8211527
五、每日一乐:
当买电脑,手机等物品时,男人要配置,女人要样子。
但是每当是选对象的时候,这个规则就反过来了...
最终解释权归爱尚合伙人(www.23hhr.com)所有,转载请注明出处。
原文地址:http://blog.csdn.net/u011638419/article/details/41642773