十六、Struts2文件上传与下载
文件上传与下载
1.文件上传前提:<form action="${pageContext.request.contextPath}/*" method="post" enctype="multipart/form-data">
2.动作类中字段需要符合命名规范
表单字段名:image
动作类:File image;
String imageFileName; 文件名
String imageContentType;文件的MIME类型
3.上传拦截器参数的配置
文件大小、文件类型限制等
错误消息提示:中文
4.多文件上传:File或者List数组
单文件上传
开发步骤:
Jsp代码:
<br/> ----单文件上传----<br/>
<s:form action="uploadOneAction" enctype="multipart/form-data">
<s:textfield name="username" label="姓名"></s:textfield>
<s:file name="photo" label="相片"></s:file>
<s:submit value="上传"></s:submit>
</s:form>
Struts.xml文件配置代码:
<package name="p1" extends="struts-default">
<action name="uploadOneAction" class="com.itheima.action.UploadAction1">
<result>/success.jsp</result>
</action>
</package>
动作类代码:
public class UploadAction1 extends ActionSupport {
// 变量命名需与表单名称保持一致
private String username;
// 与表单字段对应,必须是java.io.File类型的
private File photo;
// 上传的文件名,格式:上传字段名+FileName
private String photoFileName;
// 上传文件MIME类型,格式:上传字段名+ContentType
private String photoContentType;
public String execute() throws Exception {
// 打印相关字段属性
System.out.println(username);
System.out.println(photo);
System.out.println(photoFileName);
System.out.println(photoContentType);
/*
* 上传文件步骤:
* 1.得到上传文件的真实路径
* 2.构建输入流
* 3.构建输出流
*/
// 1.得到上传文件的真实路径
//上传字段:上传到某个文件夹。存到应用的files目录下
String storeDir = ServletActionContext.getServletContext().getRealPath(
"files");
// 把上传过来的文件,重写创建一个文件
File file = new File(storeDir, photoFileName);
/*
// 以前复制文件的方式
* 但是现在呢?我们不需要这么做啦,Struts2都帮我们封装了
InputStream in = new FileInputStream(photo);
OutputStream out = new FileOutputStream(file);
int len = 0;
byte[] bys = new byte[1024];
while ((len = in.read(bys)) != -1) {
out.write(bys, 0, len);
}
in.close();
out.close();
*/
FileUtils.copyFile(photo, file);
return SUCCESS;
}
}
2、多文件上传
将文件类型定义为:List 或者File数组
Jsp代码:
<br>-----多文件上传-----<br>
<form action="${pageContext.request.contextPath}/upload2.action" method="post" enctype="multipart/form-data">
用户名:<input type="text" name="username"/><br/>
靓照:<input type="file" name="photo"/><br/>
靓照:<input type="file" name="photo"/><br/>
<input type="submit" value="上传"/>
</form>
Struts.xml文件配置代码:
<action name="upload2" class="com.itheima.actions.UploadAction2" method="upload">
<!-- <interceptor-ref name="defaultStack"> -->
<!-- <param name="fileUpload.allowedTypes">image/jpeg,image/png</param> -->
<!-- <param name="fileUpload.allowedExtensionsSet">jpg,jpeg,png</param> -->
<!-- </interceptor-ref> -->
<result>/success.jsp</result>
<result name="error">/error.jsp</result>
<result name="input">/indexMulti.jsp</result>
</action>
动作类代码:
//文件上传:fileUpload拦截器完成的
public class UploadAction2 extends ActionSupport {
private String username;
private File[] photo;//和表单的上传字段名保持一致。类型是File类型的 .数组或List
private String[] photoFileName;//上传的文件名
private String[] photoContentType;//上传文件的MIME类型
public String upload(){
//上传字段:上传到某个文件夹。存到应用的images目录下
String realPath = ServletActionContext.getServletContext().getRealPath("/images");
File directory = new File(realPath);
if(!directory.exists()){
directory.mkdirs();
}
try {
for(int i=0;i<photo.length;i++){
FileUtils.copyFile(photo[i], new File(directory, photoFileName[i]));
}
return SUCCESS;
} catch (IOException e) {
e.printStackTrace();
return ERROR;
}
}
}
3、原理分析:
a、是由一个拦截器来完成的。fileUpload
可以通过配置拦截器的参数,指定拦截的扩展名或文件的MIME类型
<action name="uploadOneAction" class="com.itheima.action.UploadAction1">
<interceptor-ref name="defaultStack">
<!--对已有的拦截器注入参数 -->
<param name="fileUpload.allowedExtensions">txt</param>
</interceptor-ref>
<result>/success.jsp</result>
</action>
b、超出大小或非法文件的上传,会报错(转向一个input的视图)
通过:
<s:actionError/> <s:feildError/>显示错误消息的提示
c、错误消息提示改为中文版:借助国际化的消息资源文件
如果是通过配置全局默认参数引起的错误,最好用全局的消息资源文件。
struts2默认的提示资源文件:struts2-core-**.jar 的org.apache.struts2的struts-message.properties文件中。比着key值覆盖对应的value即可。
4、文件下载
原理:是一个结果类型来处理的。stream
编码步骤:
动作类:
public class DownloadAction extends ActionSupport {
// 文件下载用到的输入流
private InputStream imageFileIn;
// 记住下载文件的文件名
private String fileName;
public String download1() throws Exception {
// 给输入流赋值即可
String realPath = ServletActionContext.getServletContext().getRealPath(
"/file/mm.jpg");
// c:\apacher\file\4.jpg
fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
// 解决中文名称乱码文件
fileName = URLEncoder.encode(fileName, "UTF-8");
imageFileIn = new FileInputStream(realPath);
return SUCCESS;
}
}
struts.xml配置文件:主要是对stream类型的结果进行配置
<action name="download1" class="com.itheima.action.DownloadAction" method="download1">
<result type="stream">
<!--动作类中InputStream的字段名 -->
<param name="inputName">imageFileIn</param>
<!-- 告知浏览器响应头:文件的MIME类型 -->
<param name="contentType">application/octet-stream</param>
<!--告诉浏览器下载的方式 -->
<!-- 使用OGNL表达式获取动作类中的属性 -->
<param name="contentDisposition">attachment;filename=${fileName}</param>
</result>
</action>