7.Struts2的文件上传
l Struts2的文件上传是基于第三方组件的,需要包含相应jar包,其中以apache的commons-io.jar与commons-fileupload.jar使用最多。
l 文件上传action的简单写法
package edu.yzu.action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
@SuppressWarnings("serial")
public class FileUpLoadAction extends ActionSupport {
private File photo;// file控件的名字
private String photoFileName;// 提交上来的文件的名字。不能随便命名
// 必须与相应字段对应。
private String photoContentType;
//上传文件的类型(如果word文件的类型为application/msword,这此可以在tomcat配置文件web.xml中找到,
//这个类型对限制上传文件类型也很有用)。也不能随便命名。这两个字段如此命名的原因可以在struts的FileUploadInterceptor
//源码中找到
/*下面这种搞法可以同时接收几个文件的上传,
* 但是有点要注意,上传的file控件的name必须要一样,
* 接收上来的文件按顺序存在files中,
* 对应文件的文件名存在filesFileName中,
* 对应文件类型则存在filesContentType中,
* 这种搞法在不确定,或者可以在客户端动态改变上传文件个数时极有用,
* 如给邮件添加附件等
*/
/*
private List<File> files;
private List<String>filesFileName;
private List<String>filesContentType;
public List<File> getFiles() {
return files;
}
public void setFiles(List<File> files) {
this.files = files;
}
public List<String> getFilesFileName() {
return filesFileName;
}
public void setFilesFileName(List<String> filesFileName) {
this.filesFileName = filesFileName;
}
public List<String> getFilesContentType() {
return filesContentType;
}
public void setFilesContentType(List<String> filesContentType) {
this.filesContentType = filesContentType;
}
*/
public File getPhoto() {
return photo;
}
public void setPhoto(File photo) {
this.photo = photo;
}
public String getPhotoFileName() {
return photoFileName;
}
public void setPhotoFileName(String photoFileName) {
this.photoFileName = photoFileName;
}
public String getPhotoContentType() {
return photoContentType;
}
public void setPhotoContentType(String photoContentType) {
this.photoContentType = photoContentType;
}
@Override
public String execute() throws Exception {
System.out.println(photoContentType);
InputStream input = new FileInputStream(photo);
//得到文件的上传后保存的地方
String path = ServletActionContext.getServletContext().getRealPath(
"/images/users");
File savefile = new File(path, this.getPhotoFileName());
OutputStream output = new FileOutputStream(savefile);
byte[] buffer = new byte[1024];
int length = 0;
while ((length = input.read(buffer)) > 0) {
output.write(buffer, 0, length);
}
output.close();
input.close();
return SUCCESS;
}
}
l 限制文件上传的配置,可以限制每个上传文件的大小,上传文件的类型等(可以struts的FileUploadInterceptor的源码中查看到,类型的写法在tomcat的web.xml中找到)
<action name="upload" class="edu.yzu.action.FileUpLoadAction">
<result>/loadok.jsp</result>
<result name="input">/upload.jsp</result>
<interceptor-ref name="fileUpload">
<!-- 多个允许类型可用逗号分开,源码可查!
如果一个不被允许的文件上传,则后引发错误,这个错误消息也放在filederror里面,
一旦发生这个错误,则会转回到input对应的路径上去!这些错误的消息并不太好处理,
所以跟类型转换出现错误一样,struts2使此类错误可以国际化,以方便配置,及按需显示。
这些配置可以在struts-messages.properties中找到,然后在自己的国际化文件中配置即可
如上传文件类型不被允许的错误为:struts.messages.error.content.type.not.allowed
可以在国际化文件中这么配置:struts.messages.error.content.type.not.allowed=file type is error!以指定自己的
想要显示的消息!
这个action配置了两次fileUpload这个拦截器,这并不会引发错,但没有这个必要。
拦截器配置几次执行几次拦截,并且拦截器的执行顺序与配置顺序一致
-->
<param name="allowedTypes">application/msword</param>
</interceptor-ref>
<!-- 一旦一个action显示配置了一个拦截器,则默认拦截器将不起作用,如果需要则要显示引入 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>