struts2单文件上传:
首先是一个jsp文件上传页面,这个比较简单,就是一个表单,里面有个文件上传框
<!--在进行文件上传时,表单提交方式一定要是post的方式,因为文件上传时二进制文件可能会很大,还有就是enctype属性,这个属性一定要写成multipart/form-data,
不然就会以二进制文本上传到服务器端-->
<s:actionerror/><br/>
<!--注意:添加命名空间namespace="/"、否则在第一次上传之后地址将发生改变-->
<!--注意:2.enctype="multipart/form-data"规定上传类型 否则上传文件在那头会出错-->
<s:form action="upload" enctype="multipart/form-data" namespace="/" method="POST">
<!--做标记用 用来判断是否重复登陆-->
<s:token/>
<s:file name="myFile" label="文件上传"/>
<s:textfield name="name" label="用户名"/>
<s:submit value="提交"/>
</s:form>
<h2>文件下载内容:</h2><br/>
a.html:<a href="down">点击下载</a><br/>
<!--struts.xml -->
<package name="my" namespace="/" extends="struts-default">
<action name="upload" class="com.cn.struts.action.MyFileUploadAction">
<result>/success.jsp</result>
</action>
<action name="down" class="com.cn.struts.action.MyDownloadAction">
<result type="stream">
<param name="bufferSize">1024</param>
</result>
</action>
</package>
接下来是FileUploadAction部分代码,因为struts2对上传和下载都提供了很好的实习机制,所以在action这段我们只需要写很少的代码就行:
package com.cn.struts.action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class MyFileUploadAction extends ActionSupport{
public File getMyFile() {
return myFile;
}
public void setMyFile(File myFile) {
this.myFile = myFile;
}
public String getMyFileContentType() {
return myFileContentType;
}
public void setMyFileContentType(String myFileContentType) {
this.myFileContentType = myFileContentType;
}
public String getMyFileFileName() {
return myFileFileName;
}
public void setMyFileFileName(String myFileFileName) {
this.myFileFileName = myFileFileName;
}
private File myFile;// 上传来的文件
private String myFileContentType;// 上传文件的类型
private String myFileFileName;// 上传文件的名字
public String execute() throws Exception {
//1.获得输入流
InputStream in=new FileInputStream(myFile);
//2.获得文件存储路径
//tomcat下webapps 项目名
File toDir=new File(ServletActionContext.getServletContext().getRealPath("/upload"));
//3.判断是文件路径是否存在,不存在则创建文件
if(toDir.exists()==false){
toDir.mkdir();
}
System.out.println(toDir.getAbsolutePath());
//4.输出流
OutputStream out=new FileOutputStream(new File(toDir,myFileFileName));
byte[] bs=new byte[1024];
int len=0;
while((len=in.read(bs))!=-1){
out.write(bs,0,len);
}
out.flush();
in.close();
out.close();
return "success";
}
}
首先我们要清楚一点,这里的myFile并不是真正指代jsp上传过来的文件,当文件上传过来时,struts2首先会寻找struts.multipart.saveDir(这个是在default.properties里面有)这个name所指定的存放位置,我们可以新建一个struts.properties属性文件来指定这个临时文件存放位置,如果没有指定,那么文件会存放在tomcat的apache-tomcat-7.0.29\work\Catalina\localhost\目录下,然后我们可以指定文件上传后的存放位置,通过输出流将其写到流里面就行了,这时我们就可以在文件夹里看到我们上传的文件了。
文件上传后我们还需要将其下载下来,其实struts2的文件下载原理很简单,就是定义一个输入流,然后将文件写到输入流里面就行,关键配置还是在struts.xml这个配置文件里配置:
FileDownloadAction代码如下:
package com.cn.struts.action;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.URLEncoder;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class MyDownloadAction extends ActionSupport{
protected String contentType;//下载内容类型
protected long contentLength;//下载内容长度
protected String contentDisposition;//下载内容配置(名字)
protected InputStream inputStream;//输入流
public String execute() throws Exception{
contentType="text/html";
//contentDisposition="attachment;filename="+new String("你好.html".getBytes(), "iso-8859-1");
contentDisposition="attachment;filename="+URLEncoder.encode("你好.html", "iso-8859-1");//转码 firebug不会识别这个utf-8
String downloadPath=ServletActionContext.getServletContext().getRealPath("/upload/a.html");
inputStream=new FileInputStream(downloadPath);
contentLength=inputStream.available();
return "success";
}
public String getContentType() {
return contentType;
}
public void setContentType(String contentType) {
this.contentType = contentType;
}
public long getContentLength() {
return contentLength;
}
public void setContentLength(long contentLength) {
this.contentLength = contentLength;
}
public String getContentDisposition() {
return contentDisposition;
}
public void setContentDisposition(String contentDisposition) {
this.contentDisposition = contentDisposition;
}
public InputStream getInputStream() {
return inputStream;
}
public void setInputStream(InputStream inputStream) {
this.inputStream = inputStream;
}
}