一,概述
用Apache的fileupload组件实现上传下载比自己动手写一大堆代码方便很多,用struts2提供的上传下载功能则更是简单了不少.虽然简单,但涉及到的点还是有点多,稍微弄错,控制台就给你一个强烈的反应,一大堆的错误日志.写一篇博客,巩固一下.(IDE:MyEclipse)
二,走进文件上传
1)jsp页面准备
<form name="frmFile" action="${pageContext.request.contextPath }/fileUploadAction"
enctype="multipart/form-data" method="post">
文件:<input type="file" name="file1"/><br/>
<input type="submit" value="上传"/><br/>
</form>
在upload.jsp页面的body标签内添加一个表单,配置好路径,通过fileUploadAction访问FileUploadAction.java中的上传业务方法;需要注意的是,上传的表单必须声明enctype="multipart/form-data";方法肯定是指定为post了.
2)Action类开发
package com.bighuan.e_fileupload;
import java.io.File;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.FileUploadInterceptor;
import com.opensymphony.xwork2.ActionSupport;
/**
* 文件上传Action类
* @author bighuan
*
*/
public class FileUploadAction extends ActionSupport {
/**
* 对应表单里的 文件:<input type="file" name="file1"/><br/>
*/
private File file1;
// 文件名
private String file1FileName;
// 文件类型(MIME),服务器认识的类型
private String file1ContentType;
public File getFile1() {
// FileUploadInterceptor
return file1;
}
public void setFile1(File file1) {
this.file1 = file1;
}
public String getFile1FileName() {
return file1FileName;
}
public void setFile1FileName(String file1FileName) {
this.file1FileName = file1FileName;
}
public String getFile1ContentType() {
return file1ContentType;
}
public void setFile1ContentType(String file1ContentType) {
this.file1ContentType = file1ContentType;
}
@Override
public String execute() throws Exception {
// ****拿到上传的文件,进行处理****
// 把文件上传到upload目录
/**
* file1就是srcFile
*/
String path = ServletActionContext.getServletContext().getRealPath(
"/upload");
// 创建目标文件对象,文件对象的名字为file1FileName
File destFile = new File(path, file1FileName);
// 把上传的文件拷贝到目标文件中
// FileUtils.copyFile(srcFile, destFile);
FileUtils.copyFile(file1, destFile);
return SUCCESS;
}
}
a)在Action中,声明private File file1,这个File的变量名必须叫file1,对应于表单里提交过来的那个文件的name="file1",然后struts2的拦截器就会进行相应的数据封装了,就和普通数据(如表单提交过来的username,pwd的信息)的封装是一样的;同时还要实现file1对应的setter和getter方法;
b)那file1FileName属性呢?file1FileName对应于表单提交过来的文件的文件名,命名格式也是固定的(你所声明的File变量名称拼接上FileName如:file1FileName),实现对应的setter和getter方法,就可以拿到对应文件的文件名.你上传的是XXX.jpg,得到的file1FileName就是XXX.jpg,由此类推.还有file1ContentType文件类型也是类似的用法,记住即可.了解了就容易记住...
c)上传的核心业务逻辑就在execute()方法中,本文上传文件是要将文件上传到WebRoot目录下的upload目录下.通过servlet的API拿到upload的绝对路径(如本项目的path为:\develop\tomcat\apache-tomcat-7.0.77\webapps\day29_struts2\upload).有了文件名,有了路径,就可以创建目标文件对象new File(path,File1FileName)了,然后通过FileUtils的copyFile方法就可以实现上传文件的拷贝,这样就上传成功.
3)在struts.xml中配置Action
<package name="file_upload" extends="struts-default">
<!-- action name 不要写成fileUpload,fileUpload是一个关键字,因为struts内部可能用了这个name,容易出错 -->
<action name="fileUploadAction" class="com.bighuan.e_fileupload.FileUploadAction" method="execute">
<!-- 限制运行上传的文件的类型 -->
<interceptor-ref name="defaultStack">
<!-- 限制运行文件的扩展名 -->
<param name="fileUpload.allowedExtensions">txt,jpg,jar</param>
</interceptor-ref>
<result name="success">/e/success.jsp</result>
<!-- 配置错误视图 -->
<result name="input">/e/error.jsp</result>
</action>
</package>
a)注意,敲黑板了哈,提醒自己,哈哈哈...<Action>的name不要写成"fileUpload",这是strut2的一个关键字吧,换一个名字,如果你偏要那么干,就出错了...
b)可通过拦截器限制上传文件的类型.
c)成功就跳转到success.jsp;报错的话浏览器页面会显示一个input视图,这样不太好看,就通过input自己配置一个错误页面error.jsp就行.
d)struts2默认上传大小为2M,可在strtus.xml中通过常量更改大小.
<!-- 4,struts.multipart.maxSize=2097152 ,默认是2M,改为80M-->
<constant name="struts.multipart.maxSize" value="83886080"></constant>
4)运行
启动服务器,部署项目,上传文件,成功了就到服务器相应项目下的upload下看有没有自己上传的文件.就这样...
三,总结
下一篇当然就是关于文件下载的博客了,敬请期待吧!!!