正式学习文件上传之前,需要搞清楚一件事,所谓的文件上传指的就是用户将本地文件通过某种方式提交到服务器端,然后保存在服务器端主机的某个地方,跟文件下载不同的是,文件下载需要解决的是文件如何从服务器到客户端,那么文件上传正好相反,需要研究客户端从服务器端的过程,搞清楚这个,问题就好办多了,另外Struts2中使用{fileupload}拦截器来处理用户的文件上传操作,好的看下面的表单:
<form name="myForm" enctype="multipart/form-data" action="upload" method="post">
<input type="file" name="myDoc" />
<input type="submit" value="上传" />
</form>
文件上传中,需要采用post方式提交,且将enctype设置为“multipart/form-data”,另外需要注意输入项类型为file的name属性值为myDoc,再看处理文件上传的Action类的配置,
package com.struts2.action;
import java.io.File;
import com.opensymphony.xwork2.ActionSupport;
public class UploadAction extends ActionSupport {
// 用来接收前台上传过来的文件信息
private File myDoc;
// 上传文件的MIME类型
private String myDocContentType;
// 上传文件的名称
private String myDocFileName;
@Override
public String execute() throws Exception {
return SUCCESS;
}
public File getMyDoc() {
return myDoc;
}
public void setMyDoc(File myDoc) {
this.myDoc = myDoc;
}
public String getMyDocContentType() {
return myDocContentType;
}
public void setMyDocContentType(String myDocContentType) {
this.myDocContentType = myDocContentType;
}
public String getMyDocFileName() {
return myDocFileName;
}
public void setMyDocFileName(String myDocFileName) {
this.myDocFileName = myDocFileName;
}
}
一般,我们可以看到提交表单文件上传输入项的name属性值为myDoc,所以需要在UploadAction里面提供三个属性:File类型的myDoc属性、String类型的myDocContentType属性、String类型的myDocFileName属性,一定要记住这几个属性的前缀一定要与表单里面的name属性值保持一致,否则就无法赋值,切记!!
文件一旦上传到服务器端被Action类的接收到之后,这个问题就转化问普通本地的IO流操作了,就可以按照自己的设计将文件放置到任意位置,此时如果你的上传文件大小超过2M大小,就会抛出异常,这是怎么回事呢?原因在于Struts2的默认配置中,对文件上传处理做了些默认配置,因此如果需要,Struts2中支持修改文件上传的请求解析器、文件存储的临时目录以及文件上传大小的限制,先看如下Struts2默认配置:
### Parser to handle HTTP POST requests, encoded using the MIME-type multipart/form-data
# struts.multipart.parser=cos
# struts.multipart.parser=pell
# struts.multipart.parser=jakarta-stream
#可以设置文件上传请求由哪个框架进行解析
struts.multipart.parser=jakarta
# uses javax.servlet.context.tempdir by default
#文件上传的临时目录
struts.multipart.saveDir=
#文件上传的最大byte数
struts.multipart.maxSize=2097152
我们既可以在src目录下新建一个struts.properties文件来修改默认设置,
#将文件上传大小的限制设置为10M
struts.multipart.maxSize=10485760
也可以在struts.xml中,通过常量的形式修改:
<constant name="struts.multipart.maxSize" value="10485760"/>
好的,说完了单个文件上传,再来谈谈批量上传,批量上传指的是在一次文件上传请求中,同时上传多个文件,这个对于Struts2更是小菜一碟,只需做少量改动,需要将Action的三个属性分别变为对应的数组类型即可,看例子:
为了满足批量上传,表单的修改如下:
<form name="myForm" enctype="multipart/form-data" action="upload" method="post">
<input type="file" name="myDoc" />
<input type="file" name="myDoc" />
<input type="file" name="myDoc" />
<input type="submit" value="批量上传" />
</form>
struts.xml中的配置无需做任何变动,看Action类的变化,由于要处理批量上传,所以需要将对应类型变为数组类型,看配置:
package com.struts2.action;
import java.io.File;
import com.opensymphony.xwork2.ActionSupport;
public class UploadAction2 extends ActionSupport {
// 用来接收前台上传过来的文件信息
private File[] myDoc;
// 上传文件的MIME类型
private String[] myDocContentType;
// 上传文件的名称
private String[] myDocFileName;
@Override
public String execute() throws Exception {
return SUCCESS;
}
public File[] getMyDoc() {
return myDoc;
}
public void setMyDoc(File[] myDoc) {
this.myDoc = myDoc;
}
public String[] getMyDocContentType() {
return myDocContentType;
}
public void setMyDocContentType(String[] myDocContentType) {
this.myDocContentType = myDocContentType;
}
public String[] getMyDocFileName() {
return myDocFileName;
}
public void setMyDocFileName(String[] myDocFileName) {
this.myDocFileName = myDocFileName;
}
}
属性类型变为数组类型后,毫无疑问每个数组相同索引对应的是同一个上传文件,上传的文件可以通过迭代相应的数组进行处理,需要注意的是也可以用List类型来代替数组类型,结果都是一样;基本配置如上了,但是另一个问题来了,用户不能随便上传任意大小的任意类型的文件,所以Struts2通过使用fileUpload拦截器对文件上传大小和类型的限制;
1、首先说说对大小的限制,Struts2中提供了两种方式对文件大小进行限制,分别为通过设置struts.multipart.maxSize和fileUpload拦截器的maximumSize属性进行实现文件大小控制,那么它俩有什么区别呢?前者是控制一次上传请求过程称,所有上传文件大小的和,而后者是对上传文件中每个文件的大小,需要注意这一点,在说说对文件类型的控制,文件类型也是通过fileUpload拦截器进行设置的,下面通过一个配置来设置每个上传文件的大小以及文件类型的控制:
<action name="upload" class="com.ognl.action.UploadAction">
<result name="success">/index.jsp</result>
<interceptor-ref name="fileUpload">
<!-- 设置Struts2允许上传文件的最大比特数 -->
<param name="maximumSize">5242880</param>
<!-- 允许上传文件的MIME类型 -->
<param name="allowedTypesSet">image/jpeg,image/gif</param>
</interceptor-ref>
2、设置临时目录
由于Struts2框架在将文件正式传递到一个Action之前,会首先将文件保存到一个临时目录中,默认情况下同javax.servlet.context.tempdir相同路径,如果想要自主设置该目录的话,可以在struts.properties文件里面通过设置struts.multipart.saveDir来改变默认路径;
好的,文件上传的内容基本这么多了,注意与文件下载的不同之处,对比学习就可以,总体而言都比较的简洁;