文件上传
1.jsp的设置
- enctype=”multipart/form-data” 上传必备
- method=”post”
- 使用
<s: file name="XX"/>
<s:form action="/Upload" method="post" enctype="multipart/form-data" theme="simple">
选择图片:<s:file name="myPicture" /><br/>
<s:submit value="do it"/>
</s:form>
2.Action的设置
1.接收三个参数
private File myPicture;//文件对象
private String myPictureFileName;//用户传入文件名 如XXX.png
private String myPictureContentType;//文件的MIME类型 如image/png
//三个参数的setter方法
public void setMyPicture(File myPicture) {
this.myPicture = myPicture;
}
public void setMyPictureFileName(String myPictureFileName) {
this.myPictureFileName = myPictureFileName;
}
public void setMyPictureContentType(String myPictureContentType) {
this.myPictureContentType = myPictureContentType;
}
2.处理上传文件
- 获得webapp下的路径ServletActionContext.getServletContext().getRealPath(“/WEB_INF/upload”);
- 获得新的文件对象 new File(路径,文件名)
- 文件拷贝
public class UploadAction extends ActionSupport implements Validateable{
public void validateExecute() {
if(myPicture==null) {
super.addFieldError("file","请选择上传文件");
}
}
@InputConfig(resultName="login")
public String execute() throws Exception {
//获取文件存储的路径
ServletContext app = ServletActionContext.getServletContext();
String path = app.getRealPath("/WEB-INF/upload");
System.out.println(path);
//保存上传文件
File file = new File(path,myPictureFileName);
FileUtils.copyFile(myPicture, file);
return "login";
}
}
3.配置文件的设置
常量配置
struts.multipart.parser=jakarta //上传文件的组件
struts.multipart.saveDir=XX //临池文件的目标 (不改)
struts.multipart.maxSize=2097152 //一次请求所有文件的大小不超2M
fileUpload拦截器
- 设置单个文件的大小
- 设置上传文件的类型
- 因为上传的Action类很少,所以拦截器直接声明在
<action>
中
<action name="Upload_*" class="action.UploadAction" method="{1}">
<!--声明上传拦截器-->
<interceptor-ref name="fileUpload">
<param name="allowedExtensions">png,gif</param>
<param name="maximumSize">102400</param>
</interceptor-ref>
<!--声明上传默认拦截器-->
<interceptor-ref name="defaultStack"/>
</action>
情况1;上传文件不符合大小时:
情况2:上传文件不符合类型时;
4.错误信息的国际化
如何使得文件过大,文件不符合类型转为中文信息?
英文信息来源
数值的含义
- {0}:文件对象的名,即
<s:file>
的name属性 - {1}:用户上传的文件本地名称
- {2}:在临时目录中的名称
- {3}:文件的mime类型
- {4}:拦截器中,文件的最大值
- -
- {0}:文件对象的名,即
- 修改成中文
添加uploadMessage.properties文件
struts.messages.error.file.too.large=文件{1}过大,请不要超过{4}
struts.messages.error.file.extension.not.allowed=文件类型为{3},不符合要求
引入到struts.xml文件中
<constant name="struts.custom.i18n.resources" value="uploadMessage"/>
修改后的结果为
文件下载
jsp的设置
fileName的作用:
- 在Action类中,配合路径定位到文件
- 在Struts.xml文件中,设为用户下载文件的默认名
<s:a action="/Download?fileName=文件名">文件名</s:a>
<s:a action="/Download?fileName=LWF.png">LWF.png</s:a>
Action类的设置
- 接收请求的参数fileName
- setter:用于请求时候注入参数
- getter:用于给用户下载文件时候,提供默认文件名
private String fileName;
//用于接收请求来的参数
public void setFileName(String fileName) {
this.fileName = fileName;
}
//用于struts.xml中输出参数
public String getFileName() {
return fileName;
}
public class DownloadAction extends ActionSupport{
//用于返回文件的方法 ,getXXX
public InputStream getInputStream() throws Exception {
//获得文件所在目录
ServletContext app = ServletActionContext.getServletContext();
String path = app.getRealPath("/WEB-INF/download");
//生成文件对象
File file=new File(path,fileName);
return new FileInputStream(file);
}
}
//增强:可以用包装的读取流来提速
return new BufferedInputStream(new FileInputStream(file));
struts.xml的设置
- 下载的逻辑视图类型为”stream”
- 设置参数
- inputName=输出流的方法名称
- contentDisposition=attachment;filename=”用户下载文件时候的默认名”
//用${fileName}从Root中取(因为有getter方法)
<action name="Download_*" class="action.DownloadAction" method="{1}">
<result type="stream">
<param name="inputName">inputStream</param><!--是默认值,也对应这方法getInputStream-->
<param name="contentDisposition">attachment;filename="hahah"</param>
</result>
</action>
执行流程
1.访问Action后,返回逻辑视图为success,type为"stream";(默认访问execute方法返回success)
2.根据参数inputName,从Action中获得文件的输出流,
3.根据contentDisposition,给被下载的文件赋予初始名
4.响应给用户