一、纯jsp文件上传
1、新建文件夹upload
内含upload.jsp,result.jsp
1)upload.jsp需要指定method="post"和enctype="multipart/form-data"
<body>
<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>
</body>
2)result.jsp(真正开发的时候不会这么去写的,这里为了了解这个过程)
<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>
当然以前jsp可以用的是smartupload组件
二、纯apache的Commons项目内的FileUpload上传文件
基本它已经做好了90%,我们修改一下就可以!
struts2它可以选择三种方式
1、默认的就是apache的Commons项目内的FileUpload,从官方网站上下载commons-fileupload-bin.zip
commons-io-bin.zip,解压缩。里面包含了jar,文档api,源代码等
本部分来阐述FileUpdate的使用
2、源代码
1)upload2.jsp
<body>
<form action="/struts2/UploadServlet" method="post" enctype="multipart/form-data">
username: <input type="text" name="username"><br>
password: <input type="password" name="password"><br>
file1: <input type="file" name="file1"><br>
file2: <input type="file" name="file2"><br>
<input type="submit" value="submit">
</form>
</body>
2)UploadServlet.java
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.omg.CORBA.portable.InputStream;
public class UploadServlet extends HttpServlet
{
@SuppressWarnings("unchecked")
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{ //先 生成一个工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
String path = request.getRealPath("/upload");
//若你上传的文件比较小几十k,那么会将文件直接放在内存中
//当上传文件比较大时,那么会先放到一个临时目录中,setRepository就是来设置这个目录 的。
factory.setRepository(new File(path));
//当上传文件超出下面的大小时,那么会先放到一个临时目录中,setSizeThreshold就是来设置这个目录 的。
factory.setSizeThreshold(1024 * 1024);
//生成ServletFileUpload实例
ServletFileUpload upload = new ServletFileUpload(factory);
try
{//list封装了客户端传过来所有属性
List<FileItem> list = upload.parseRequest(request);
for (FileItem item : list)
{//item.isFormField()来判断是否简单 的类型,true表示简单的属性。
if (item.isFormField())
{
String name = item.getFieldName();//获得字段名字
String value = item.getString("gbk");//获得字段值
System.out.println(name);
request.setAttribute(name, value);
}
else
{
String name = item.getFieldName();
String value = item.getName();
//获得文件名,先去掉路径。(因为有的浏览器返回的全部路径+文件名;有的是光返回文件名)
int start = value.lastIndexOf("\\");
String fileName = value.substring(start + 1);
request.setAttribute(name, fileName);
//这一句话相当于以下注释的所有内容,是提供 的一个便捷的操作
item.write(new File(path,fileName));
// OutputStream os = new FileOutputStream(new File(path,
// fileName));
//
// InputStream is = item.getInputStream();
//
// byte[] buffer = new byte[400];
//
// int length = 0;
//
// while ((length = is.read(buffer)) > 0)
// {
// os.write(buffer, 0, length);
// }
//
// os.close();
//
// is.close();
}
}
}
3)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>
注释掉<!-- <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>
-->
4)result2.jsp
<body>
username: ${requestScope.username }<br>
password: ${requestScope.password }<br>
file1: ${requestScope.file1 }<br>
file2: ${requestScope.file2 }
</body>
三、Struts2文件上传(更加简单方便)
1、WebRoot目录下upload.jsp文件
<s:form action="upload" theme="simple" enctype="multipart/form-data">
<table align="center" width="50%" border="1">
<tr>
<td>
username
</td>
<td>
<s:textfield name="username"></s:textfield>
</td>
</tr>
<tr>
<td>
password
</td>
<td>
<s:password name="password"></s:password>
</td>
</tr>
<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>
<tr>
<td>
<s:submit value=" submit "></s:submit>
</td>
<td>
<s:reset value=" reset "></s:reset>
</td>
</tr>
</table>
</s:form>
2、struts.xml文件加入以下内容
<action name="upload" class="com.test.action.UploadAction">
<result name="success">/uploadResult.jsp</result>
</action>
3、uploadaction.java
package com.test.action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class UploadAction extends ActionSupport
{
private String username;
private String password;
private List<File> file;//file文件体
private List<String> fileFileName;//fileFileName文件名
private List<String> fileContentType;//fileContentType文件类型,
//这三个名字命名不能改,上传多个文件时系统会一一对应
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
}
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password = password;
}
public List<File> getFile()
{
return file;
}
public void setFile(List<File> file)
{
this.file = file;
}
public List<String> getFileFileName()
{
return fileFileName;
}
public void setFileFileName(List<String> fileFileName)
{
this.fileFileName = fileFileName;
}
public List<String> getFileContentType()
{
return fileContentType;
}
public void setFileContentType(List<String> fileContentType)
{
this.fileContentType = fileContentType;
}
@Override
public String execute() throws Exception
{
for (int i = 0; i < file.size(); ++i)
{//这里一定要用字节流,不要用字符流
InputStream is = new FileInputStream(file.get(i));
//获得当前应用的根路径,ServletActionContext对应Servlet的Action的上下文
//也可以写绝对路径d:/doucument/
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;
}
}
4、uploadResult.jsp
<body>
username: <s:property value="username"/><br>
password: <s:property value="password"/><br>
file: <s:property value="fileFileName"/>
</body>
5、让系统字符集支持中文
在我们的struts.xml文件可以配置
<constant name="struts.i18n.encoding" value="gbk"></constant>
其实以后很多的strust框架中的default.properties文件中的很多内容都可以在我们的struts.xml通过<constant></constant>来赋值更改。
<constant name="struts.multipart.saveDir" value="c:\"></constant>
default.properties文件中部分字段说明
# struts.multipart.parser=cos
# struts.multipart.parser=pell
struts.multipart.parser=jakarta
以上三行表示struts上传功能对应的三种方式,其中第三种对应对应apache的fileupload
struts.multipart.saveDir=
struts.multipart.maxSize=2097152
表示上传后文件的保存路径和最大允许上传的文件为2M
三、Struts2文件上传(由客户端指定文件个数)
1、改写客户端文件WebRoot目录下upload.jsp文件
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>Insert title here</title>
<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>
</head>
<body>
<table align="center" width="50%">
<tr>
<td>
<s:fielderror cssStyle="color:red" />
</td>
</tr>
</table>
<s:form action="upload" theme="simple" enctype="multipart/form-data">
<table align="center" width="50%" border="1">
<tr>
<td>
username
</td>
<td>
<s:textfield name="username"></s:textfield>
</td>
</tr>
<tr>
<td>
password
</td>
<td>
<s:password name="password"></s:password>
</td>
</tr>
<tr>
<td>
file
</td>
<td id="more">
<s:file name="file"></s:file><input type="button" value="Add More.." οnclick="addMore()">
</td>
</tr>
<tr>
<td>
<s:submit value=" submit "></s:submit>
</td>
<td>
<s:reset value=" reset "></s:reset>
</td>
</tr>
</table>
</s:form>
</body>
2、服务器端不用修改
四、Struts2文件上传(限制类型)
(限制类型),Struts2文件上传内部已经实现好了。
只需要在struts.xml文件中增加一个拦截器就好了,同时设置好相应的参数
<action name="upload" class="com.test.action.UploadAction">
<result name="success">/uploadResult.jsp</result>
<result name="input">/upload.jsp</result><!--指strut处理错误时,自动地跳到input页面,此处需要配置-->
<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>
说明:这里拦截器一般配置在result标签下面,
至于<param name="allowedTypes">application/vnd.ms-powerpoint</param>
里面的类型可以参考tomcat目录下的文件web.xml,该文件中的一个个<mime-type>类型都显示了这些类型的表示。例如
<mime-mapping>
<extension>ppt</extension>
<mime-type>application/vnd.ms-powerpoint</mime-type>
</mime-mapping>
在message.propertiers资源文件中增加上传文件错误的提示信息
struts.messages.error.content.type.not.allowed=上传文件类型不允许,请重试!
struts.messages.error.file.too.large=上传文件过大,请重试!
当然右侧中文需要改成ascii,那么这里左侧的key是如何想出来的呢
也是通过上面 default.properties文件字段所得到的。