upload.jsp
<form action="upload.action" method="post" enctype="multipart/form-data">
username: <input type="text" name="username"><br>
file: <input type="file" name="file"><br>
<input type="submit" value="submit">
</form>
UploadAction.java
public class UploadAction extends ActionSupport
{
private String username;
//注意,file并不是指前端jsp上传过来的文件本身,而是文件上传过来存放在临时文件夹下面的文件
private File file;
//提交过来的file的名字为file,故这里是fileFileName,这里名字都为***FileName
private String fileFileName;
//提交过来的file的MIME类型
private String fileContentType;
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
}
public File getFile()
{
return file;
}
public void setFile(File file)
{
this.file = file;
}
public String getFileFileName()
{
return fileFileName;
}
public void setFileFileName(String fileFileName)
{
this.fileFileName = fileFileName;
}
public String getFileContentType()
{
return fileContentType;
}
public void setFileContentType(String fileContentType)
{
this.fileContentType = fileContentType;
}
@Override
public String execute() throws Exception
{
String root = ServletActionContext.getServletContext().getRealPath("/upload");
InputStream is = new FileInputStream(file);
OutputStream os = new FileOutputStream(new File(root, fileFileName));
System.out.println("fileFileName: " + fileFileName);
// 因为file是存放在临时文件夹的文件,我们可以将其文件名和文件路径打印出来,看和之前的fileFileName是否相同
System.out.println("file: " + file.getName());
System.out.println("file: " + file.getPath());
byte[] buffer = new byte[500];
int length = 0;
while(-1 != (length = is.read(buffer, 0, buffer.length)))
{
os.write(buffer);
}
os.close();
is.close();
return SUCCESS;
}
}
struts.xml
<action name="upload" class="com.haowan.UploadAction">
<result name="success">/index.jsp</result>
<result name="input">/upload.jsp</result>
</action>
最后WebRoot下新建一个 upload 文件夹
Action中的fileName有讲究,必须是表单中 file 的名字+FileName 属性 , 还有fileContentType也必须满足 file的名字+ContentType。
首先我们要清楚一点,这里的file并不是真正指代jsp上传过来的文件,当文件上传过来时,struts2首先会寻找struts.multipart.saveDir(这个是在default.properties里面有)这个name所指定的存放位置,我们可以新建一个struts.properties属性文件来指定这个临时文件存放位置,如果没有指定,那么文件会存放在tomcat的apache-tomcat-7.0.29\work\Catalina\localhost\目录下,然后我们可以指定文件上传后的存放位置,通过输出流将其写到流里面就行了,这时我们就可以在文件夹里看到我们上传的文件了。
Struts2默认使用 javax.servlet.context.tempdir 作为工作目录,上传的文件临时存在这里,上传结束后会被自动删除,因此开发者可以通过覆盖的Struts的struts.multipart.saveDir 属性修改工作目录。可以修改struts.multipart.maxSize修改文件的最大尺寸。具体可以在src下建一个struts.properties
struts.multipart.saveDir = /temp
struts.multipart.maxSize =100000000
Struts2自带一个名为fileUpload的拦截器,用于拦截文件的上传请求,通过该参数可以限制文件上传的类型和大小
如struts.xml
<action name="upload"
class="com.helloweenvsfei.struts2.action.UploadAction">
<interceptor-ref name="fileUpload">
<param name="allowedTypes">
image/bmp,image/x-png,image/gif,image/jpeg
</param>
<param name="maximumSize">20480</param>
</interceptor-ref>
<interceptor-ref name="defaultStack" />
<result name="input">/upload.jsp</result>
<result name="list">/uploadList.jsp</result>
</action>
注意
①还要加上defaultStack默认的拦截器堆栈。
②allowedTypes里填写的是MIME类型,不是文件名后缀 ,这个可以在%TOMCAT_HOME%/conf/web.xml中找到。
③有两处设置上传文件的最大字节,要保证 maxSize要大于拦截器中maximumSize , 否则不起作用。
多文件上传与此类似:
就是把*FileName类型变为数组 *ContentType类型变为数组,然后下面的方法只是把数组便利一遍,jsp中的文件名是相同的。
<form action="upload.action" method="post" enctype="multipart/form-data">
username: <input type="text" name="username"><br/>
file: <input type="file" name="file"><br/>
file: <input type="file" name="file"><br/>
file: <input type="file" name="file"><br/>
<input type="submit">
</form>
Action中
@Override
public String execute() throws Exception
{
for(int i=0;file!=null&&i<file.length;++i){
String root = ServletActionContext.getServletContext().getRealPath("/upload");
InputStream is = new FileInputStream(file[i]);
OutputStream os = new FileOutputStream(new File(root, fileFileName[i]));
System.out.println("fileFileName: " + fileFileName[i]);
// 因为file是存放在临时文件夹的文件,我们可以将其文件名和文件路径打印出来,看和之前的fileFileName是否相同
System.out.println("file: " + file[i].getName());
System.out.println("file: " + file[i].getPath());
byte[] buffer = new byte[1024];
int length = 0;
while(-1 != (length = is.read(buffer, 0, buffer.length)))
{
os.write(buffer);
}
os.close();
is.close();
}
return SUCCESS;
}
下载文件:
FileDownLoadAction.java
public class FileDownLoadAction extends ActionSupport
{
public InputStream getDownloadFile()
{
return ServletActionContext.getServletContext().getResourceAsStream("upload/身份证背面.jpg");
}
@Override
public String execute() throws Exception
{
return SUCCESS;
}
}
主要就是得到一个输入流,并返回出去。
struts.xml <action name="fileDownload" class="com.haowan.FileDownLoadAction">
<result name="success" type="stream">
<param name="contentDisposition">attachment;filename="IDCard.jpg"</param>
<param name="inputName">downloadFile</param>
</result>
</action>
struts.xml配置文件有几个地方我们要注意,首先是result的类型,以前我们定义一个action,result那里我们基本上都不写type属性,因为其默认是请求转发(dispatcher)的方式,除了这个属性一般还有redirect(重定向)等这些值,在这里因为我们用的是文件下载,所以type一定要定义成stream类型,告诉action这是文件下载的result,result元素里面一般还有param子元素,这个是用来设定文件下载时的参数,
inputName这个属性就是得到action中的文件输入流,名字一定要和action中的输入流属性名字相同(downloadFile 与 getDownloadFile())
,然后就是
contentDisposition
属性,这个属性一般用来指定我们希望通过怎么样的方式来处理下载的文件,如果值是
attachment
,则会弹出一个下载框,让用户选择是否下载,如果不设定这个值,那么浏览器会首先查看自己能否打开下载的文件,如果能,就会直接打开所下载的文件,(这当然不是我们所需要的),另外一个值就是filename这个就是文件在下载时所提示的文件下载名字。在配置完这些信息后,我们就能过实现文件的下载功能了。
还有filename="" 后面的参数尽量是英文的,汉语无法解析。
详情:点击打开链接