struts2文件的上传和下载
,我们暂且不修改,看会有什么结果
?1
<%
@?page?language="java"?contentType="text/html;?charset=GBK"
?2
????pageEncoding="GBK"%>
?3
<!DOCTYPE?html?PUBLIC?"-//W3C//DTD?HTML?4.01?Transitional//EN"?"http://www.w3.org/TR/html4/loose.dtd">
?4
<html>
?5
????<head>
?6
????????<meta?http-equiv="Content-Type"?content="text/html;?charset=GB18030">
?7
????????<title>Insert?title?here</title>
?8
????</head>
?9
????<body>
10
????????<form?action="result.jsp"?method="post"
11
????????????enctype="application/x-www-form-urlencoded">
12
????????????Information:
13
????????????<input?type="text"?name="info">
14
????????????<br>
15
????????????File:
16
????????????<input?type="file"?name="file">
17
????????????<br>
18
????????????<input?type="submit"?name="submit"?value="?submit?">
19
????????</form>
20
????</body>
21
</html>result.jsp
?1
<%
@?page?language="java"?contentType="text/html;?charset=GBK"
?2
????pageEncoding="GBK"%>
?3
<!DOCTYPE?html?PUBLIC?"-//W3C//DTD?HTML?4.01?Transitional//EN"?"http://www.w3.org/TR/html4/loose.dtd">
?4
<html>
?5
????<head>
?6
????????<meta?http-equiv="Content-Type"?content="text/html;?charset=GB18030">
?7
????????<title>Insert?title?here</title>
?8
????</head>
?9
????<body>
10
????????Information:<%=request.getParameter("info")%><br>
11
????????File:<%=request.getParameter("file")%><br>
12
????</body>
13
</html>结果:

2、修改result.jsp页面代码,输出读入的流
<%
@?page?import="java.io.*"%>
????<body>
????????<%
????????????InputStream?is?=?request.getInputStream();
????????????BufferedReader?br?=?new?BufferedReader(new?InputStreamReader(is));
????????????String?buffer?=?null;
????????????while?((buffer?=?br.readLine())?!=?null)?{
????????????????out.print(buffer?+?"<br>");
????????????}
????????%>
????</body>结果:
这个结果可以断定,文件的上传并没有成功,而仅仅是上传了文件的路径信息而已
3、把upload.jsp中form的enctype属性改为enctype="multipart/form-data"
????????<form?action="result.jsp"?method="post"?enctype="multipart/form-data">
????????????Information:
????????????<input?type="text"?name="info">
????????????<br>
????????????File:
????????????<input?type="file"?name="file">
????????????<br>
????????????<input?type="submit"?name="submit"?value="?submit?">
????????</form>结果:
?
说明文件上传是成功的。
(二)手动采用fileupload组建进行文件上传
upload2.jsp
?1
<%
@?page?language="java"?contentType="text/html;?charset=GB18030"
?2
????pageEncoding="GB18030"%>
?3
<!DOCTYPE?html?PUBLIC?"-//W3C//DTD?HTML?4.01?Transitional//EN"?"http://www.w3.org/TR/html4/loose.dtd">
?4
<html>
?5
????<head>
?6
????????<meta?http-equiv="Content-Type"?content="text/html;?charset=GB18030">
?7
????????<title>Insert?title?here</title>
?8
????</head>
?9
????<body>
10
????????<form?action="/MyStruts2/UploadServlet"?method="post"?enctype="multipart/form-data">
11
????????????username:
12
????????????<input?type="text"?name="username">
13
????????????<br>
14
????????????password:
15
????????????<input?type="password"?name="password">
16
????????????<br>
17
????????????file1:
18
????????????<input?type="file"?name="file1">
19
????????????<br>
20
????????????file2:
21
????????????<input?type="file"?name="file2">
22
????????????<br>
23
????????????<input?type="submit"?value="?submit?">
24
????????</form>
25
????</body>
26
</html>web.xml中的配置
??<servlet>
????<servlet-name>UploadServlet</servlet-name>
????<servlet-class>com.test.servlet.UploadServlet</servlet-class>
??</servlet>
??<servlet-mapping>
????<servlet-name>UploadServlet</servlet-name>
????<url-pattern>/UploadServlet</url-pattern>
??</servlet-mapping>UploadServle.java
?1
package?com.test.servlet;
?2
?3
import?java.io.File;
?4
import?java.io.FileOutputStream;
?5
import?java.io.IOException;
?6
import?java.io.InputStream;
?7
import?java.io.OutputStream;
?8
import?java.util.List;
?9
10
import?javax.servlet.ServletException;
11
import?javax.servlet.http.HttpServlet;
12
import?javax.servlet.http.HttpServletRequest;
13
import?javax.servlet.http.HttpServletResponse;
14
15
import?org.apache.commons.fileupload.FileItem;
16
import?org.apache.commons.fileupload.FileUploadException;
17
import?org.apache.commons.fileupload.disk.DiskFileItemFactory;
18
import?org.apache.commons.fileupload.servlet.ServletFileUpload;
19
20
@SuppressWarnings("serial")
21
public?class?UploadServlet?extends?HttpServlet?
{
22
????@SuppressWarnings(?
{?"unchecked",?"deprecation"?})
23
????public?void?doPost(HttpServletRequest?request,?HttpServletResponse?response)
24
????????????throws?ServletException,?IOException?
{
25
26
????????DiskFileItemFactory?factory?=?new?DiskFileItemFactory();
27
28
????????String?path?=?request.getRealPath("/upload");
29
30
????????factory.setRepository(new?File(path));
31
32
????????factory.setSizeThreshold(1024?*?1024);
33
34
????????ServletFileUpload?upload?=?new?ServletFileUpload(factory);
35
36
????????try?
{
37
????????????List<FileItem>?list?=?upload.parseRequest(request);
38
39
????????????for?(FileItem?item?:?list)?
{
40
????????????????if?(item.isFormField())?
{
41
????????????????????String?name?=?item.getFieldName();
42
43
????????????????????String?value?=?item.getString("gbk");
44
45
????????????????????System.out.println(name);
46
47
????????????????????request.setAttribute(name,?value);
48
????????????????}?else?
{
49
????????????????????String?name?=?item.getFieldName();
50
51
????????????????????String?value?=?item.getName();
52
53
????????????????????int?start?=?value.lastIndexOf("\\");
54
55
????????????????????String?fileName?=?value.substring(start?+?1);
56
57
????????????????????request.setAttribute(name,?fileName);
58
59
????????????????????item.write(new?File(path,?fileName));
60
61
????????????????????OutputStream?os?=?new?FileOutputStream(new?File(path,
62
????????????????????????????fileName));
63
64
????????????????????InputStream?is?=?item.getInputStream();
65
66
????????????????????byte[]?buffer?=?new?byte[400];
67
68
????????????????????int?length?=?0;
69
70
????????????????????while?((length?=?is.read(buffer))?>?0)?
{
71
????????????????????????os.write(buffer,?0,?length);
72
????????????????????}
73
74
????????????????????os.close();
75
76
????????????????????is.close();
77
78
????????????????}
79
????????????}
80
????????}
81
82
????????catch?(Exception?ex)?
{
83
????????????ex.printStackTrace();
84
????????}
85
????????request.getRequestDispatcher("upload/result2.jsp").forward(request,
86
????????????????response);
87
????}
88
89
}结果:

(三)使用struts2进行文件上传、下载
需引入两个jar包
commons-fileupload-1.2.1.jar
commons-io-1.3.2.jar这两个jar包在struts2.1.6版本中已经自带,较低版本需到apache网站下载,网址:http://commons.apache.org/
1、单文件上传
upload3.jsp
?1
<%
@?page?language="java"?contentType="text/html;?charset=GB18030"
?2
????pageEncoding="GB18030"%>
?3
<%
@?taglib?prefix="s"?uri="/struts-tags"%>
?4
<!DOCTYPE?html?PUBLIC?"-//W3C//DTD?HTML?4.01?Transitional//EN"?"http://www.w3.org/TR/html4/loose.dtd">
?5
<html>
?6
????<head>
?7
????????<meta?http-equiv="Content-Type"?content="text/html;?charset=GB18030">
?8
????????<title>Insert?title?here</title>
?9
????</head>
10
????<body>
11
????????<s:form?action="upload"?method="post"?theme="simple"
12
????????????enctype="multipart/form-data">
13
????????????<table?align="center"?width="50%"?border="1">
14
????????????????<tr>
15
????????????????????<td>
16
????????????????????????username
17
????????????????????</td>
18
????????????????????<td>
19
????????????????????????<s:textfield?name="username"></s:textfield>
20
????????????????????</td>
21
????????????????</tr>
22
????????????????<tr>
23
????????????????????<td>
24
????????????????????????password
25
????????????????????</td>
26
????????????????????<td>
27
????????????????????????<s:password?name="password"></s:password>
28
????????????????????</td>
29
????????????????</tr>
30
????????????????<tr>
31
????????????????????<td>
32
????????????????????????file
33
????????????????????</td>
34
35
????????????????????<td>
36
????????????????????????<s:file?name="file"></s:file>
37
???????????????????????
38
????????????????????</td>
39
????????????????</tr>
40
????????????????<tr>
41
????????????????????<td>
42
????????????????????????<s:submit?value="?submit?"></s:submit>
43
????????????????????</td>
44
????????????????????<td>
45
????????????????????????<s:reset?value="?reset?"></s:reset>
46
????????????????????</td>
47
????????????????</tr>
48
????????????</table>
49
????????</s:form>
50
????</body>
51
</html>web.xml中的配置
????<filter>
????????<filter-name>struts2</filter-name>
????????<filter-class>
????????????org.apache.struts2.dispatcher.FilterDispatcher
????????</filter-class>
????</filter>
????<filter-mapping>
????????<filter-name>struts2</filter-name>
????????<url-pattern>/*</url-pattern>
????</filter-mapping>
struts.xml中的配置?1
<?xml?version="1.0"?encoding="GBK"??>
?2
<!DOCTYPE?struts?PUBLIC
?3
????"-//Apache?Software?Foundation//DTD?Struts?Configuration?2.0//EN"
?4
????"http://struts.apache.org/dtds/struts-2.0.dtd">
?5
????
?6
<struts>
?7
????<constant?name="struts.i18n.encoding"?value="gbk"></constant>
?8
????<constant?name="struts.multipart.saveDir"?value="c:\"></constant>
?9
????<package?name="struts2"?extends="struts-default">
10
????????<action?name="upload"?class="com.test.action.UploadAction">
11
????????????<result?name="success">/upload/result3.jsp</result>
12
????????</action>
13
????</package>
14
</struts>UploadAction.java
?1
package?com.test.action;
?2
?3
import?java.io.File;
?4
import?java.io.FileInputStream;
?5
import?java.io.FileOutputStream;
?6
import?java.io.InputStream;
?7
import?java.io.OutputStream;
?8
?9
import?org.apache.struts2.ServletActionContext;
10
11
import?com.opensymphony.xwork2.ActionSupport;
12
13
@SuppressWarnings("serial")
14
public?class?UploadAction?extends?ActionSupport?
{
15
????private?String?username;
16
????private?String?password;
17
????private?File?file;
18
????private?String?fileFileName;
19
????private?String?fileContentType;
20
21
????public?String?getUsername()?
{
22
????????return?username;
23
????}
24
25
????public?void?setUsername(String?username)?
{
26
????????this.username?=?username;
27
????}
28
29
????public?String?getPassword()?
{
30
????????return?password;
31
????}
32
33
????public?void?setPassword(String?password)?
{
34
????????this.password?=?password;
35
????}
36
37
????public?File?getFile()?
{
38
????????return?file;
39
????}
40
41
????public?void?setFile(File?file)?
{
42
????????this.file?=?file;
43
????}
44
45
????public?String?getFileFileName()?
{
46
????????return?fileFileName;
47
????}
48
49
????public?void?setFileFileName(String?fileFileName)?
{
50
????????this.fileFileName?=?fileFileName;
51
????}
52
53
????public?String?getFileContentType()?
{
54
????????return?fileContentType;
55
????}
56
57
????public?void?setFileContentType(String?fileContentType)?
{
58
????????this.fileContentType?=?fileContentType;
59
????}
60
61
????@SuppressWarnings("deprecation")
62
????@Override
63
????public?String?execute()?throws?Exception?
{
64
????????InputStream?is?=?new?FileInputStream(file);
65
????????String?root?=?ServletActionContext.getRequest().getRealPath("/upload");
66
????????File?destFile?=?new?File(root,?this.getFileFileName());
67
????????OutputStream?os?=?new?FileOutputStream(destFile);
68
????????byte[]?buffer?=?new?byte[400];
69
70
????????int?length?=?0;
71
72
????????while?((length?=?is.read(buffer))?>?0)?
{
73
????????????os.write(buffer,?0,?length);
74
????????}
75
????????is.close();
76
????????os.close();
77
????????return?SUCCESS;
78
????}
79
}
结果:
?
2、多文件上传
修改action
????private?List<File>?file;
????private?List<String>?fileFileName;
????private?List<String>?fileContentType;
????public?String?execute()?throws?Exception?
{
????????for?(int?i?=?0;?i?<?file.size();?++i)?
{
????????????InputStream?is?=?new?FileInputStream(file.get(i));
????????????String?root?=?ServletActionContext.getRequest().getRealPath(
????????????????????"/upload");
????????????File?destFile?=?new?File(root,?this.getFileFileName().get(i));
????????????OutputStream?os?=?new?FileOutputStream(destFile);
????????????byte[]?buffer?=?new?byte[400];
????????????int?length?=?0;
????????????while?((length?=?is.read(buffer))?>?0)?
{
????????????????os.write(buffer,?0,?length);
????????????}
????????????is.close();
????????????os.close();
????????}
????????return?SUCCESS;
????}修改upload3.jsp
????????????????<tr>
????????????????????<td>
????????????????????????file1
????????????????????</td>
????????????????????<td>
????????????????????????<s:file?name="file"></s:file>
????????????????????</td>
????????????????</tr>
????????????????<tr>
????????????????????<td>
????????????????????????file2
????????????????????</td>
????????????????????<td>
????????????????????????<s:file?name="file"></s:file>
????????????????????</td>
????????????????</tr>
????????????????<tr>
????????????????????<td>
????????????????????????file3
????????????????????</td>
????????????????????<td>
????????????????????????<s:file?name="file"></s:file>
????????????????????</td>
????????????????</tr>结果:

3、任意数量文件上传
在多文件上传的基础上修改upload3.jsp
????????<script?type="text/javascript">
????????function?addMore()
????????
{
????????????var?td?=?document.getElementById("more");
????????????var?br?=?document.createElement("br");
????????????var?input?=?document.createElement("input");
????????????var?button?=?document.createElement("input");
????????????input.type?=?"file";
????????????input.name?=?"file";
????????????button.type?=?"button";
????????????button.value?=?"Remove";
????????????button.onclick?=?function()
????????????
{
????????????????td.removeChild(br);
????????????????td.removeChild(input);
????????????????td.removeChild(button);
????????????}
????????????td.appendChild(br);
????????????td.appendChild(input);
????????????td.appendChild(button);
????????}
????</script>
????????????????<tr>
????????????????????<td>
????????????????????????file1
????????????????????</td>
????????????????????<td?id="more">
????????????????????????<s:file?name="file"></s:file>
????????????????????????<input?type="button"?value="Add?More.."?onclick="addMore()">
????????????????????</td>
????????????????</tr>
结果:
(四)文件上传类型、大小的限制
使用struts的拦截器,struts2-core-2.1.6.jar/org.apache.struts2.interceptor.FileUploadInterceptor.class的源码中我们可以看到:
public?class?FileUploadInterceptor?extends?AbstractInterceptor?{
????private?static?final?long?serialVersionUID?=?-4764627478894962478L;
????protected?static?final?Logger?LOG?=?LoggerFactory.getLogger(FileUploadInterceptor.class);
????private?static?final?String?DEFAULT_MESSAGE?=?"no.message.found";
????protected?boolean?useActionMessageBundle;
????protected?Long?maximumSize;
????protected?Set<String>?allowedTypesSet?=?Collections.emptySet();
????protected?Set<String>?allowedExtensionsSet?=?Collections.emptySet();所以我们只需的struts.xml中配置它的属性allowedTypesSet即可。在action节点中修改拦截器(默认的拦截器中已经有fileUpload拦截器,我们必须提取出来进行参数设置,然后在加上默认的拦截器)。
????????<action?name="upload"?class="com.test.action.UploadAction">
????????????<result?name="success">/upload/result3.jsp</result>
????????????<result?name="input">/upload/upload3.jsp</result>
????????????<interceptor-ref?name="fileUpload">
????????????????<param?name="maximumSize">409600</param>
????????????????<param?name="allowedTypes">
????????????????????application/vnd.ms-powerpoint
????????????????</param>
????????????</interceptor-ref>
????????????<interceptor-ref?name="defaultStack"></interceptor-ref>
????????</action>其中<param?name="allowedTypes">application/vnd.ms-powerpoint</param>的allowedTypes的值可在C:\Tomcat 6.0\conf的web.xml文件中查找。
报错信息:
严重:?Content-Type?not?allowed:?file?"intrl.txt"?"upload__138d8aca_120b73e9cf4__8000_00000002.tmp"?text/plain
(五)文件的下载
download.jsp
????????<s:a?href="/MyStruts2/download.action">download</s:a>DownloadAction.java
?1
package?com.test.action;
?2
?3
import?java.io.InputStream;
?4
?5
import?org.apache.struts2.ServletActionContext;
?6
?7
import?com.opensymphony.xwork2.ActionSupport;
?8
?9
public?class?DownloadAction?extends?ActionSupport?
{
10
????public?InputStream?getDownloadFile()?
{
11
????????return?ServletActionContext.getServletContext().getResourceAsStream(
12
????????????????"/upload/intrl.ppt");
13
????}
14
15
????@Override
16
????public?String?execute()?throws?Exception?
{
17
????????return?SUCCESS;
18
????}
19
}
20
web.xml中action配置
????????<action?name="download"
????????????class="com.test.action.DownloadAction">
????????????<result?name="success"?type="stream">
????????????????<param?name="contentType">
????????????????????application/vnd.ms-powerpoint
????????????????</param>
????????????????<param?name="contentDisposition">
????????????????????filename="intrl.ppt"
????????????????</param>
????????????????<param?name="inputName">downloadFile</param>
????????????</result>
????????</action>结果:
FROM:http://www.cnitblog.com/intrl/archive/2009/04/18/56447.html
<%
????@SuppressWarnings(?