在Web项目中文件上传是一个必不可少的经典功能,因此为了满足文件上传功能需在form 表单里添加一条属性
enctype ="multipart/form-data" 。
此属性的功能是设置表单的MIME 编码。如果不设置的话 form表单 默编码格式为application/x-www-form-urlencoded ,此种格式不能用于文件上传。如果是多文件上传的话,多个 input标签的 name 属性必须是同一个值。示例如下:
我把单文件和多文件的上传功能都通过这一个JSP页面为展示。
现在开始配置struts.xml文件,我打算把文件的保存目录通过参数的方式写在配置文件里而不是直接写死在代码里,这样成是为了方便以后更改。
OK!现在开始写代码部分。
这是一个实现单文件上传功能的类代码,因为在单文件上传的form里定义一个input标签用来上传文件,这个标签的name属性为single,因此代码中有一个实现了getter/setter 方法的变量single(其实变量名叫什么并不重要,重要的是方法名必须和标签的name名相同)。而singleContentType和singleFileName其实就是用来表示这个文件的类型和文件名。copyFile 方法用于实现文件复制,即把上传的文件复制到指定的路径下,因为这个方法是FileUtils类的静态方法,而FileUtils类包含在commons-io-1.3.2.jar 包文件里,所以在项目里还需要把这个文件从Struts2的类库包里导入进来。
下面再看多文件上传的类,其实多文件上传和单文件上是一个道理。
多文件和单文件上传类的最大不同是用数组来表示接收的文件其他并无什么特别,因此不多解释了。
再解释下文件上传容量的限制,Struts2的默认文件上传大小为5M,可以通过在struts2.xml文件中配置常量来改变文件上传的大小限制,例如将大小限制在10M。
<constant name="struts.multipart.maxSize" value=" 10701096"></constant>
还有一点是当多文件上传时上传容量限制是指多个文件容量的总和,例如三个文件上传时三个文件的容量总和不能大于以前的容量限制即10M。如果超出容量限制时控制台将报如下错误:
警告: Unable to parse request
org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (6185364) exceeds the configured maximum (2097152)
at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.java:914)