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
?1package?com.test.servlet;
?2
?3import?java.io.File;
?4import?java.io.FileOutputStream;
?5import?java.io.IOException;
?6import?java.io.InputStream;
?7import?java.io.OutputStream;
?8import?java.util.List;
?9
10import?javax.servlet.ServletException;
11import?javax.servlet.http.HttpServlet;
12import?javax.servlet.http.HttpServletRequest;
13import?javax.servlet.http.HttpServletResponse;
14
15import?org.apache.commons.fileupload.FileItem;
16import?org.apache.commons.fileupload.FileUploadException;
17import?org.apache.commons.fileupload.disk.DiskFileItemFactory;
18import?org.apache.commons.fileupload.servlet.ServletFileUpload;
19
20@SuppressWarnings("serial")
21public?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
?1package?com.test.action;
?2
?3import?java.io.File;
?4import?java.io.FileInputStream;
?5import?java.io.FileOutputStream;
?6import?java.io.InputStream;
?7import?java.io.OutputStream;
?8
?9import?org.apache.struts2.ServletActionContext;
10
11import?com.opensymphony.xwork2.ActionSupport;
12
13@SuppressWarnings("serial")
14public?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
?1package?com.test.action;
?2
?3import?java.io.InputStream;
?4
?5import?org.apache.struts2.ServletActionContext;
?6
?7import?com.opensymphony.xwork2.ActionSupport;
?8
?9public?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}
20web.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