struts2实现文件的上传、下载
struts2能实现上传、下载是基于组件commons-fileupload-1.2.2.jar和commons-io-2.0.1.jar。
表单元素的enctype属性,
表单的enctype属性指定的是表单数据的编码方式,该属性有如下3个值:
application/x-www-form-urlencoded:这是默认的编码方式,它只处理表单域里的value属性值,采用这种编码方式的表单会将表单域的值处理成URL编码方式。
multipart/form-data:这种编码方式会以二进制流的方式来处理表单数据,这种编码方式会把文件域指定文件的内容也封装到请求参数里。
text/plain:这种编码方式当表单的action属性为mailto:URL的形式时比较方便,这种方式主要适用于直接通过表单发送邮件的方式。
序:
我们根据例子来分析:
jsp页面:
<s:form action=”uploadAction”method=”post” enctype=”multipart/form-data”>
<s:label name=”file” /> <s:file />
<s:submit value=”上传” />
<s:form>
UploadAction :
public class UploadAction extends ActionSupport {
private String file;//这里的名字要和JSP参数名一样,(为了set方法);
private String fileFileName; //参数名+FileName,必须这样。保存文件真正的名字。
private String fileContentType; //参数名+ContentType,必须这样。保存文件真正的类型。
/*
* get/set方法
*/
public String execute() throws Exception {
//JSP的form将表单内容以二进制的形式传参给action。
//这时,action的file保存了上传的文件。
//获得file的路径
System.out.println(file.getAbsolutePath());
}
}
注:
上例,我机子上的运行结果如下:
文件上传后,struts2会先临时将这个文件保存起来,struts.multipart.saveDir 用来指定临时文件保存位置。struts.multipart.saveDir=null(没指定)的话会保存到服务器中的一个位置。
配置struts.multipart.saveDir有两种方式:
- 在struts.xml中配置,<constant name="struts.multipart.saveDir" value="/tmp"/>。
- 写个sturt.properties,struts.multipart.saveDir=/temp。
struts2默认上传文件最大是2M,我们可以修改配置文件来更改大小(以字节为单位)
- 在struts.xml中配置,<constant name="struts.multipart.maxSize" value="10701096"/>
- 在struts.properties中配置, struts.multipart.maxSize=10701096。
注:
在struts.properties中的配置都可以放到struts.xml中用constant配置。
好了,现在进入正题:
单个文件上传:
public String execute() throws Exception {
//在webRoot下建个文件夹,用来存放上传来的文件,“upload”。
//其实这个文件只是一个映射,真正保存文件的upload在Tomcat那里。
//获得Tomcat下upload的真实路径。
String realPath = ServletActionContext
.getRequest()
.getSession()
.getServletContext()
.getRealPath(“upload”);
//通过真实路径+真实文件名,完全将文件copy过来。
File theCopy = new File(realPath, fileFileName);
//输入流插到临时文件上,读数据。输入,输出,都是相对于程序。
InputStream is = new FileInputStream(file);
//输出流插到新文件上,写数据。
OutputStream os = new OutputStream(theCopy);
//一个缓冲字节数组。
byte[] buffer = new byte[];
int length=0;
//开始copy
while ( (length=is.read(buffer0)) != -1 ) {
os.write(buffer, 0, length);
}
}
//临时文件的删除?
多个文件上传:
多个文件的上传跟单个文件上传类似,只是操作的是一个集合而已。
例子如下:
jsp页面:
<s:from action=”upload” method=”post” enctype=”multipart/form-data”>
<! - - 上传的所有参数必须是一个名,struts将它们封装成一个集合-- >
<s:file name=”files”> <br />
<s:file name=”files”> <br />
<s:submit value=”上传” />
</s:form>
action:
public class UploadFileAction extends ActionSupport {
private List<File> files;
private List<String> filesFileName;
private List<String> filesContentType;
//get、set方法
public String execute( ) throws Exception {
String realpath = ServletActionContext
.getRequest()
.getSession()
.getServletContext()
.getRealPath("upload");
for(int i=0; i<files.size(); i++ ) {
File copy = new File(realpath, filesFileName.get(i) );
inputStream is = new FileInputStream ( files.get(i) );
OutputStream os = new FileOutputStream (copy );
byte[] buffer = new byte[];
int length = 0;
while( ( length =is.read(buffer) ) != -1 ) {
os.write( buffer, 0, length );
}
}
return SUCCESS;
}
}
文件下载:
action:
public class DownloadFileAction extends ActionSupport {
private String fileName;
private InputStream downloadFile;
//主要的方法
public InputStream getDownloadFile() {
try {
//模拟根据条件下载对应的文件
if( num == 1 )
//将制定的文件作为一个流返回出去;
return return ServletActionContext
.getServletContext()
.getResourceAsStream("/upload/xxoo.jpg");
else
//将制定的文件作为一个流返回出去;
return return ServletActionContext
.getServletContext()
.getResourceAsStream("/upload/jj.txt");
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public String getFileName() {
return this.fileName;
}
public String execute() throws Exception {
return SUCCESS;
}
}
struts配置
<struts >
<! – 指定,文件上传时临时文件的位置- - >
<constant name=”struts.multipart.saveDir” value=”/upload” />
<action name=”download” class=”action.DownloadFileAction” >
<!- - 要注意result的类型是stream - - >
<result name=”success” type=”stream” >
<!—inputName参数指定文件的源头,根据这个配置,找getDownloadFile方法获得文件流 - ->
<param name=”inputName”>downloadFile</param>
<!—指定下载的方式,默认的是inline,这种方式,浏览器如果能打开的文件的话,就直接打开,而不会下载(如.txt格式文件)。一般指定是attachment方式,让用户可以选择是打开还是下载。- - >
<param
name=”contentDisposition”>attachment;filename=”xxoo.jpg”</param>
<! – 如果想不写死文件的话,”xxoo.jpg”可以换成${fileName},action里必须提供fileName的get方法- - >
</result>
</struts>
jsp页面:
<a href = “download.action?num=1”>下载文件</a>
还可以指定文件的格式,缓冲大小,如:
<result name="success" type="stream">
<param name="contentType">image/jpeg</param>
<param name="inputName">imageStream</param>
<param name="contentDisposition">attachment;filename="document.pdf"</param>
<param name="bufferSize">1024</param>
</result>
相关推荐
在struts2基础上实现的包括单文件、多文件的上传及下载
一个利用Struts2实现文件的上传下载,使用的是同步方式。没有用ajax请求
Struts2+hibernate+spring 框架实现文件上传下载功能。
struts实现的文件上传下载功能,最大可以上传到150MB
网上的Struts2进行的文件下载一般都是单文件或者固定的文件,并没有(很少)实现随意文件的下载的例子 提供多文件上传,上传成功后,提供刚上传的文件下载功能(其他的都可以在其上面进行扩充) 多文件 上传 下载...
struts与hibernate实现文件的上传与动态下载 主要就是运用struts2.2和hibernate3.6进行文件上传与下载,并且能动态的下载,里面包括了详细的构建文档,以及代码
Struts2实现文件上传的功能,简洁方便,欢迎下载。
struts1 实现文件上传下载...
struts1和struts2分别实现文件上传下载功能
自己做的一个struts2 实现文件批量上传功能,
基于Struts2的文件上传下载功能的完整源代码。经过测试可正确运行。
struts1实现文件上传和下载,struts1实现文件上传和下载。
struts2实现的文件上传下载,上传文件重命名(按时间戳)
使用Struts2实现文件上传和下载的所有方案
struts2实现文件上传(单个+多个文件上传
一个swfupload+struts2实现多文件上传的案例。
注意:private String uploadContextType;应更正为private String uploadContentType;不过不影响正常运行
struts2实现的多个文件上传struts2实现的多个文件上传struts2实现的多个文件上传struts2实现的多个文件上传
java struts2实现文件上传进度条显示