本文介绍了:
1.基于表单的文件上传
2.Struts 2 的文件下载
3.Struts2.文件上传
4.使用FileInputStream FileOutputStream文件流来上传
5.使用FileUtil上传
6.使用IOUtil上传
7.使用IOUtil上传
8.使用数组上传多个文件
9.使用List上传多个文件
----1.基于表单的文件上传-----
fileupload.jsp
- <body>
- <formaction="showFile.jsp"name="myForm"method="post"enctype="multipart/form-data">
- 选择上传的文件
- <inputtype="file"name="myfile"><br/><br/>
- <inputtype="submit"name="mySubmit"value="上传"/>
- </form>
- </body>
<body>
<form action="showFile.jsp" name="myForm" method="post" enctype="multipart/form-data">
选择上传的文件
<input type="file" name="myfile"><br/><br/>
<input type="submit" name="mySubmit" value="上传"/>
</form>
</body>
showFile.jsp
- <body>
- 上传的文件的内容如下:
- <%
- InputStreamis=request.getInputStream();
- InputStreamReaderisr=newInputStreamReader(is);
- BufferedReaderbr=newBufferedReader(isr);
- Stringcontent=null;
- while((content=br.readLine())!=null){
- out.print(content+"<br/>");
- }
- %>
- </body>
<body>
上传的文件的内容如下:
<%
InputStream is=request.getInputStream();
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
String content=null;
while((content=br.readLine())!=null){
out.print(content+"<br/>");
}
%>
</body>
----2.手动上传-----
- 通过二进制刘获取上传文件的内容,并将上传的文件内容保存到服务器的某个目录,这样就实现了文件上传。由于这个处理过程完全依赖与开发自己处理二进制流,所以也称为“手动上传”。
- 从上面的第一个例子可以看到,使用二进制流获取的上传文件的内容与实际文件的内容有还是有一定的区别,包含了很多实际文本中没有的字符。所以需要对获取的内容进行解析,去掉额外的字符。
通过二进制刘获取上传文件的内容,并将上传的文件内容保存到服务器的某个目录,这样就实现了文件上传。由于这个处理过程完全依赖与开发自己处理二进制流,所以也称为“手动上传”。
从上面的第一个例子可以看到,使用二进制流获取的上传文件的内容与实际文件的内容有还是有一定的区别,包含了很多实际文本中没有的字符。所以需要对获取的内容进行解析,去掉额外的字符。
----3 Struts2.文件上传----
- Struts2中使用Common-fileUpload文件上传框架,需要在web应用中增加两个Jar文件,即commons-fileupload.jar.commons-io.jar
- 需要使用fileUpload拦截器:具体的说明在struts2-core-2.3.4.jar\org.apache.struts2.interceptor\FileUploadInterceptor.class里面
- 下面来看看一点源代码
Struts2中使用Common-fileUpload文件上传框架,需要在web应用中增加两个Jar 文件, 即 commons-fileupload.jar. commons-io.jar
需要使用fileUpload拦截器:具体的说明在 struts2-core-2.3.4.jar \org.apache.struts2.interceptor\FileUploadInterceptor.class 里面
下面来看看一点源代码
- publicclassFileUploadInterceptorextendsAbstractInterceptor{
- privatestaticfinallongserialVersionUID=-4764627478894962478L;
- protectedstaticfinalLoggerLOG=LoggerFactory.getLogger(FileUploadInterceptor.class);
- privatestaticfinalStringDEFAULT_MESSAGE="no.message.found";
- protectedbooleanuseActionMessageBundle;
- protectedLongmaximumSize;
- protectedSet<String>allowedTypesSet=Collections.emptySet();
- protectedSet<String>allowedExtensionsSet=Collections.emptySet();
- privatePatternMatchermatcher;
- @Inject
- publicvoidsetMatcher(PatternMatchermatcher){
- this.matcher=matcher;
- }
- publicvoidsetUseActionMessageBundle(Stringvalue){
- this.useActionMessageBundle=Boolean.valueOf(value);
- }
- //这就是struts.xml中param为什么要配置为allowedExtensions
- publicvoidsetAllowedExtensions(StringallowedExtensions){
- allowedExtensionsSet=TextParseUtil.commaDelimitedStringToSet(allowedExtensions);
- }
- //这就是struts.xml中param为什么要配置为allowedTypes而不是上面的allowedTypesSet
- publicvoidsetAllowedTypes(StringallowedTypes){
- allowedTypesSet=TextParseUtil.commaDelimitedStringToSet(allowedTypes);
- }
- publicvoidsetMaximumSize(LongmaximumSize){
- this.maximumSize=maximumSize;
- }
- }
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();
private PatternMatcher matcher;
@Inject
public void setMatcher(PatternMatcher matcher) {
this.matcher = matcher;
}
public void setUseActionMessageBundle(String value) {
this.useActionMessageBundle = Boolean.valueOf(value);
}
//这就是struts.xml 中param为什么要配置为 allowedExtensions
public void setAllowedExtensions(String allowedExtensions) {
allowedExtensionsSet = TextParseUtil.commaDelimitedStringToSet(allowedExtensions);
}
//这就是struts.xml 中param为什么要配置为 allowedTypes 而不是 上面的allowedTypesSet
public void setAllowedTypes(String allowedTypes) {
allowedTypesSet = TextParseUtil.commaDelimitedStringToSet(allowedTypes);
}
public void setMaximumSize(Long maximumSize) {
this.maximumSize = maximumSize;
}
}
- 官员文件初始值大小上面的类中的说明
- <li>maximumSize(optional)-themaximumsize(inbytes)thattheinterceptorwillallowafilereferencetobeset
- *ontheaction.Note,thisis<b>not</b>relatedtothevariouspropertiesfoundinstruts.properties.
- *Defaulttoapproximately2MB.</li>
- 具体说的是这个值在struts.properties中有设置。下面就来看里面的设置
- ###ParsertohandleHTTPPOSTrequests,encodedusingtheMIME-typemultipart/form-data
- 文件上传解析器
- #struts.multipart.parser=cos
- #struts.multipart.parser=pell
- #默认使用jakata框架上传文件
- struts.multipart.parser=jakarta
- #上传时候默认的临时文件目录
- #usesjavax.servlet.context.tempdirbydefault
- struts.multipart.saveDir=
- #上传时候默认的大小
- struts.multipart.maxSize=2097152
官员文件初始值大小 上面的类中的说明
<li>maximumSize (optional) - the maximum size (in bytes) that the interceptor will allow a file reference to be set
* on the action. Note, this is <b>not</b> related to the various properties found in struts.properties.
* Default to approximately 2MB.</li>
具体说的是这个值在struts.properties 中有设置。 下面就来看 里面的设置
### Parser to handle HTTP POST requests, encoded using the MIME-type multipart/form-data
文件上传解析器
# struts.multipart.parser=cos
# struts.multipart.parser=pell
#默认 使用jakata框架上传文件
struts.multipart.parser=jakarta
#上传时候 默认的临时文件目录
# uses javax.servlet.context.tempdir by default
struts.multipart.saveDir=
#上传时候默认的大小
struts.multipart.maxSize=2097152
案例:使用FileInputStream FileOutputStream文件流来上传
action.java
- packagecom.sh.action;
- importjava.io.File;
- importjava.io.FileInputStream;
- importjava.io.FileOutputStream;
- importorg.apache.struts2.ServletActionContext;
- importcom.opensymphony.xwork2.ActionSupport;
- publicclassMyUpActionextendsActionSupport{
- privateFileupload;//上传的文件
- privateStringuploadContentType;//文件的类型
- privateStringuploadFileName;//文件名称
- privateStringsavePath;//文件上传的路径
- //注意这里的保存路径
- publicStringgetSavePath(){
- returnServletActionContext.getRequest().getRealPath(savePath);
- }
- publicvoidsetSavePath(StringsavePath){
- this.savePath=savePath;
- }
- @Override
- publicStringexecute()throwsException{
- System.out.println("type:"+this.uploadContentType);
- StringfileName=getSavePath()+"\\"+getUploadFileName();
- FileOutputStreamfos=newFileOutputStream(fileName);
- FileInputStreamfis=newFileInputStream(getUpload());
- byte[]b=newbyte[1024];
- intlen=0;
- while((len=fis.read(b))>0){
- fos.write(b,0,len);
- }
- fos.flush();
- fos.close();
- fis.close();
- returnSUCCESS;
- }
- //getset
- }
package com.sh.action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class MyUpAction extends ActionSupport {
private File upload; //上传的文件
private String uploadContentType; //文件的类型
private String uploadFileName; //文件名称
private String savePath; //文件上传的路径
//注意这里的保存路径
public String getSavePath() {
return ServletActionContext.getRequest().getRealPath(savePath);
}
public void setSavePath(String savePath) {
this.savePath = savePath;
}
@Override
public String execute() throws Exception {
System.out.println("type:"+this.uploadContentType);
String fileName=getSavePath()+"\\"+getUploadFileName();
FileOutputStream fos=new FileOutputStream(fileName);
FileInputStream fis=new FileInputStream(getUpload());
byte[] b=new byte[1024];
int len=0;
while ((len=fis.read(b))>0) {
fos.write(b,0,len);
}
fos.flush();
fos.close();
fis.close();
return SUCCESS;
}
//get set
}
struts.xml
- <?xmlversion="1.0"encoding="UTF-8"?>
- <!DOCTYPEstrutsPUBLIC
- "-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.3//EN"
- "http://struts.apache.org/dtds/struts-2.3.dtd">
- <struts>
- <constantname="struts.i18n.encoding"value="utf-8"/>
- <constantname="struts.devMode"value="true"/>
- <constantname="struts.convention.classes.reload"value="true"/>
- <constantname="struts.multipart.saveDir"value="f:/tmp"/>
- <packagename="/user"extends="struts-default">
- <actionname="up"class="com.sh.action.MyUpAction">
- <resultname="input">/up.jsp</result>
- <resultname="success">/success.jsp</result>
- <!--在web-root目录下新建的一个upload目录用于保存上传的文件-->
- <paramname="savePath">/upload</param>
- <interceptor-refname="fileUpload">
- <!--采用设置文件的类型来限制上传文件的类型-->
- <paramname="allowedTypes">text/plain</param>
- <!--采用设置文件的后缀来限制上传文件的类型-->
- <paramname="allowedExtensions">png,txt</param>
- <!--设置文件的大小默认为2M[单位:byte]-->
- <paramname="maximumSize">1024000</param>
- </interceptor-ref>
- <interceptor-refname="defaultStack"/>
- </action>
- </package>
- </struts>
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <constant name="struts.i18n.encoding" value="utf-8"/> <constant name="struts.devMode" value="true"/> <constant name="struts.convention.classes.reload" value="true" /> <constant name="struts.multipart.saveDir" value="f:/tmp"/> <package name="/user" extends="struts-default"> <action name="up" class="com.sh.action.MyUpAction"> <result name="input">/up.jsp</result> <result name="success">/success.jsp</result> <!-- 在web-root目录下新建的一个 upload目录 用于保存上传的文件 --> <param name="savePath">/upload</param> <interceptor-ref name="fileUpload"> <!--采用设置文件的类型 来限制上传文件的类型--> <param name="allowedTypes">text/plain</param> <!--采用设置文件的后缀来限制上传文件的类型 --> <param name="allowedExtensions">png,txt</param> <!--设置文件的大小 默认为 2M [单位:byte] --> <param name="maximumSize">1024000</param> </interceptor-ref> <interceptor-ref name="defaultStack"/> </action> </package> </struts>
up.jsp
- <body>
- <h2>Struts2上传文件</h2>
- <s:fielderror/>
- <s:formaction="up"method="post"name="upform"id="form1"enctype="multipart/form-data"theme="simple">
- 选择文件:
- <s:filename="upload"cssStyle="width:300px;"/>
- <s:submitvalue="确定"/>
- </s:form>
- </body>
<body>
<h2>Struts2 上传文件</h2>
<s:fielderror/>
<s:form action="up" method="post" name="upform" id="form1" enctype="multipart/form-data" theme="simple">
选择文件:
<s:file name="upload" cssStyle="width:300px;"/>
<s:submit value="确定"/>
</s:form>
</body>
success.jsp
- <body>
- <b>上传成功!</b>
- <s:propertyvalue="uploadFileName"/><br/>
- [img]<s:propertyvalue="'upload/'+uploadFileName"/>[/img]
- </body>
<body>
<b>上传成功!</b>
<s:property value="uploadFileName"/><br/>
[img]<s:property value="'upload/'+uploadFileName"/>[/img]
</body>
案例:使用FileUtil上传
action.java
- packagecom.sh.action;
- importjava.io.File;
- importjava.io.IOException;
- importjava.text.DateFormat;
- importjava.text.SimpleDateFormat;
- importjava.util.Date;
- importjava.util.Random;
- importjava.util.UUID;
- importorg.apache.commons.io.FileUtils;
- importorg.apache.struts2.ServletActionContext;
- importcom.opensymphony.xwork2.ActionContext;
- importcom.opensymphony.xwork2.ActionSupport;
- publicclassFileUtilUploadextendsActionSupport{
- privateFileimage;//文件
- privateStringimageFileName;//文件名
- privateStringimageContentType;//文件类型
- publicStringexecute(){
- try{
- if(image!=null){
- //文件保存的父目录
- StringrealPath=ServletActionContext.getServletContext()
- .getRealPath("/image");
- //要保存的新的文件名称
- StringtargetFileName=generateFileName(imageFileName);
- //利用父子目录穿件文件目录
- Filesavefile=newFile(newFile(realPath),targetFileName);
- if(!savefile.getParentFile().exists()){
- savefile.getParentFile().mkdirs();
- }
- FileUtils.copyFile(image,savefile);
- ActionContext.getContext().put("message","上传成功!");
- ActionContext.getContext().put("filePath",targetFileName);
- }
- }catch(IOExceptione){
- //TODOAuto-generatedcatchblock
- e.printStackTrace();
- }
- return"success";
- }
- /**
- *new文件名=时间+随机数
- *@paramfileName:old文件名
- *@returnnew文件名
- */
- privateStringgenerateFileName(StringfileName){
- //时间
- DateFormatdf=newSimpleDateFormat("yyMMddHHmmss");
- StringformatDate=df.format(newDate());
- //随机数
- intrandom=newRandom().nextInt(10000);
- //文件后缀
- intposition=fileName.lastIndexOf(".");
- Stringextension=fileName.substring(position);
- returnformatDate+random+extension;
- }
- //getset
- }
package com.sh.action;
import java.io.File;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import java.util.UUID;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class FileUtilUpload extends ActionSupport {
private File image; //文件
private String imageFileName; //文件名
private String imageContentType;//文件类型
public String execute(){
try {
if(image!=null){
//文件保存的父目录
String realPath=ServletActionContext.getServletContext()
.getRealPath("/image");
//要保存的新的文件名称
String targetFileName=generateFileName(imageFileName);
//利用父子目录穿件文件目录
File savefile=new File(new File(realPath),targetFileName);
if(!savefile.getParentFile().exists()){
savefile.getParentFile().mkdirs();
}
FileUtils.copyFile(image, savefile);
ActionContext.getContext().put("message", "上传成功!");
ActionContext.getContext().put("filePath", targetFileName);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "success";
}
/**
* new文件名= 时间 + 随机数
* @param fileName: old文件名
* @return new文件名
*/
private String generateFileName(String fileName) {
//时间
DateFormat df = new SimpleDateFormat("yyMMddHHmmss");
String formatDate = df.format(new Date());
//随机数
int random = new Random().nextInt(10000);
//文件后缀
int position = fileName.lastIndexOf(".");
String extension = fileName.substring(position);
return formatDate + random + extension;
}
//get set
}
struts.xml
- <actionname="fileUtilUpload"class="com.sh.action.FileUtilUpload">
- <resultname="input">/fileutilupload.jsp</result>
- <resultname="success">/fuuSuccess.jsp</result>
- </action>
<action name="fileUtilUpload" class="com.sh.action.FileUtilUpload"> <result name="input">/fileutilupload.jsp</result> <result name="success">/fuuSuccess.jsp</result> </action>
fileutilupload.jsp
- <formaction="${pageContext.request.contextPath}/fileUtilUpload.action"
- enctype="multipart/form-data"method="post">
- 文件:<inputtype="file"name="image"/>
- <inputtype="submit"value="上传"/>
- </form>
<form action="${pageContext.request.contextPath }/fileUtilUpload.action"
enctype="multipart/form-data" method="post">
文件:<input type="file" name="image"/>
<input type="submit" value="上传"/>
</form>
fuuSuccess.jsp
- body>
- <b>${message}</b>
- ${imageFileName}<br/>
- <imgsrc="upload/${filePath}"/>
- </body>
body>
<b>${message}</b>
${imageFileName}<br/>
<img src="upload/${filePath}"/>
</body>
案例:使用IOUtil上传
action.java
- packagecom.sh.action;
- importjava.io.File;
- importjava.io.FileInputStream;
- importjava.io.FileOutputStream;
- importjava.text.DateFormat;
- importjava.text.SimpleDateFormat;
- importjava.util.Date;
- importjava.util.UUID;
- importorg.apache.commons.io.IOUtils;
- importorg.apache.struts2.ServletActionContext;
- importcom.opensymphony.xwork2.ActionContext;
- importcom.opensymphony.xwork2.ActionSupport;
- publicclassIOUtilUploadextendsActionSupport{
- privateFileimage;//文件
- privateStringimageFileName;//文件名
- privateStringimageContentType;//文件类型
- publicStringexecute(){
- try{
- if(image!=null){
- //文件保存的父目录
- StringrealPath=ServletActionContext.getServletContext()
- .getRealPath("/image");
- //要保存的新的文件名称
- StringtargetFileName=generateFileName(imageFileName);
- //利用父子目录穿件文件目录
- Filesavefile=newFile(newFile(realPath),targetFileName);
- if(!savefile.getParentFile().exists()){
- savefile.getParentFile().mkdirs();
- }
- FileOutputStreamfos=newFileOutputStream(savefile);
- FileInputStreamfis=newFileInputStream(image);
- //如果复制文件的时候出错了返回值就是-1所以初始化为-2
- Longresult=-2L;//大文件的上传
- intsmresult=-2;//小文件的上传
- //如果文件大于2GB
- if(image.length()>1024*2*1024){
- result=IOUtils.copyLarge(fis,fos);
- }else{
- smresult=IOUtils.copy(fis,fos);
- }
- if(result>-1||smresult>-1){
- ActionContext.getContext().put("message","上传成功!");
- }
- ActionContext.getContext().put("filePath",targetFileName);
- }
- }catch(Exceptione){
- e.printStackTrace();
- }
- returnSUCCESS;
- }
- /**
- *new文件名=时间+全球唯一编号
- *@paramfileNameold文件名
- *@returnnew文件名
- */
- privateStringgenerateFileName(StringfileName){
- //时间
- DateFormatdf=newSimpleDateFormat("yy_MM_dd_HH_mm_ss");
- StringformatDate=df.format(newDate());
- //全球唯一编号
- Stringuuid=UUID.randomUUID().toString();
- intposition=fileName.lastIndexOf(".");
- Stringextension=fileName.substring(position);
- returnformatDate+uuid+extension;
- }
- //getset
- }
package com.sh.action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
import org.apache.commons.io.IOUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class IOUtilUpload extends ActionSupport {
private File image; //文件
private String imageFileName; //文件名
private String imageContentType;//文件类型
public String execute(){
try {
if(image!=null){
//文件保存的父目录
String realPath=ServletActionContext.getServletContext()
.getRealPath("/image");
//要保存的新的文件名称
String targetFileName=generateFileName(imageFileName);
//利用父子目录穿件文件目录
File savefile=new File(new File(realPath),targetFileName);
if(!savefile.getParentFile().exists()){
savefile.getParentFile().mkdirs();
}
FileOutputStream fos=new FileOutputStream(savefile);
FileInputStream fis=new FileInputStream(image);
//如果复制文件的时候 出错了返回 值就是 -1 所以 初始化为 -2
Long result=-2L; //大文件的上传
int smresult=-2; //小文件的上传
//如果文件大于 2GB
if(image.length()>1024*2*1024){
result=IOUtils.copyLarge(fis, fos);
}else{
smresult=IOUtils.copy(fis, fos);
}
if(result >-1 || smresult>-1){
ActionContext.getContext().put("message", "上传成功!");
}
ActionContext.getContext().put("filePath", targetFileName);
}
} catch (Exception e) {
e.printStackTrace();
}
return SUCCESS;
}
/**
* new文件名= 时间 + 全球唯一编号
* @param fileName old文件名
* @return new文件名
*/
private String generateFileName(String fileName) {
//时间
DateFormat df = new SimpleDateFormat("yy_MM_dd_HH_mm_ss");
String formatDate = df.format(new Date());
//全球唯一编号
String uuid=UUID.randomUUID().toString();
int position = fileName.lastIndexOf(".");
String extension = fileName.substring(position);
return formatDate + uuid + extension;
}
//get set
}
struts.xml
- <actionname="iOUtilUpload"class="com.sh.action.IOUtilUpload">
- <resultname="input">/ioutilupload.jsp</result>
- <resultname="success">/iuuSuccess.jsp</result>
- </action>
<action name="iOUtilUpload" class="com.sh.action.IOUtilUpload"> <result name="input">/ioutilupload.jsp</result> <result name="success">/iuuSuccess.jsp</result> </action>
ioutilupload.jsp
- <formaction="${pageContext.request.contextPath}/iOUtilUpload.action"
- enctype="multipart/form-data"method="post">
- 文件:<inputtype="file"name="image"/>
- <inputtype="submit"value="上传"/>
- </form>
<form action="${pageContext.request.contextPath }/iOUtilUpload.action"
enctype="multipart/form-data" method="post">
文件:<input type="file" name="image"/>
<input type="submit" value="上传"/>
</form>
iuuSuccess.jsp
- <body>
- <b>${message}</b>
- ${imageFileName}<br/>
- <imgsrc="image/${filePath}"/>
- </body>
<body>
<b>${message}</b>
${imageFileName}<br/>
<img src="image/${filePath}"/>
</body>
案例:删除服务器上的文件
- /**
- *从服务器上删除文件
- *@paramfileName文件名
- *@returntrue:从服务器上删除成功false:否则失败
- */
- publicbooleandelFile(StringfileName){
- Filefile=newFile(fileName);
- if(file.exists()){
- returnfile.delete();
- }
- returnfalse;
- }
/**
* 从服务器上 删除文件
* @param fileName 文件名
* @return true: 从服务器上删除成功 false:否则失败
*/
public boolean delFile(String fileName){
File file=new File(fileName);
if(file.exists()){
return file.delete();
}
return false;
}
案例:使用数组上传多个文件
action.java
- packagecom.sh.action;
- importjava.io.File;
- importjava.io.FileInputStream;
- importjava.io.FileOutputStream;
- importjava.util.Random;
- importorg.apache.struts2.ServletActionContext;
- importcom.opensymphony.xwork2.ActionContext;
- importcom.opensymphony.xwork2.ActionSupport;
- /**
- *@authorAdministrator
- *
- */
- publicclassArrayUploadextendsActionSupport{
- privateFile[]image;
- privateString[]imageContentType;
- privateString[]imageFileName;
- privateStringpath;
- publicStringgetPath(){
- returnServletActionContext.getRequest().getRealPath(path);
- }
- publicvoidsetPath(Stringpath){
- this.path=path;
- }
- @Override
- publicStringexecute()throwsException{
- for(inti=0;i<image.length;i++){
- imageFileName[i]=getFileName(imageFileName[i]);
- StringtargetFileName=getPath()+"\\"+imageFileName[i];
- FileOutputStreamfos=newFileOutputStream(targetFileName);
- FileInputStreamfis=newFileInputStream(image[i]);
- byte[]b=newbyte[1024];
- intlen=0;
- while((len=fis.read(b))>0){
- fos.write(b,0,len);
- }
- }
- returnSUCCESS;
- }
- privateStringgetFileName(StringfileName){
- intposition=fileName.lastIndexOf(".");
- Stringextension=fileName.substring(position);
- intradom=newRandom().nextInt(1000);
- return""+System.currentTimeMillis()+radom+extension;
- }
- //getset
- }
package com.sh.action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Random;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
/**
* @author Administrator
*
*/
public class ArrayUpload extends ActionSupport {
private File[] image;
private String[] imageContentType;
private String[] imageFileName;
private String path;
public String getPath() {
return ServletActionContext.getRequest().getRealPath(path);
}
public void setPath(String path) {
this.path = path;
}
@Override
public String execute() throws Exception {
for(int i=0;i<image.length;i++){
imageFileName[i]=getFileName(imageFileName[i]);
String targetFileName=getPath()+"\\"+imageFileName[i];
FileOutputStream fos=new FileOutputStream(targetFileName);
FileInputStream fis=new FileInputStream(image[i]);
byte[] b=new byte[1024];
int len=0;
while ((len=fis.read(b))>0) {
fos.write(b, 0, len);
}
}
return SUCCESS;
}
private String getFileName(String fileName){
int position=fileName.lastIndexOf(".");
String extension=fileName.substring(position);
int radom=new Random().nextInt(1000);
return ""+System.currentTimeMillis()+radom+extension;
}
//get set
}
struts.xml
- <actionname="arrayUpload"class="com.sh.action.ArrayUpload">
- <interceptor-refname="fileUpload">
- <paramname="allowedTypes">
- image/x-png,image/gif,image/bmp,image/jpeg
- </param>
- <paramname="maximumSize">10240000</param>
- </interceptor-ref>
- <interceptor-refname="defaultStack"/>
- <paramname="path">/image</param>
- <resultname="success">/arraySuccess.jsp</result>
- <resultname="input">/arrayupload.jsp</result>
- </action>
<action name="arrayUpload" class="com.sh.action.ArrayUpload"> <interceptor-ref name="fileUpload"> <param name="allowedTypes"> image/x-png,image/gif,image/bmp,image/jpeg </param> <param name="maximumSize">10240000</param> </interceptor-ref> <interceptor-ref name="defaultStack"/> <param name="path">/image</param> <result name="success">/arraySuccess.jsp</result> <result name="input">/arrayupload.jsp</result> </action>
arrayUpload.jsp
- <body>
- ===========多文件上传=================
- <formaction="${pageContext.request.contextPath}/arrayUpload.action"
- enctype="multipart/form-data"method="post">
- 文件1:<inputtype="file"name="image"/><br/>
- 文件2:<inputtype="file"name="image"/><br/>
- 文件3:<inputtype="file"name="image"/>
- <inputtype="submit"value="上传"/>
- </form>
- </body>
<body>
===========多文件上传=================
<form action="${pageContext.request.contextPath }/arrayUpload.action"
enctype="multipart/form-data" method="post">
文件1:<input type="file" name="image"/><br/>
文件2:<input type="file" name="image"/><br/>
文件3:<input type="file" name="image"/>
<input type="submit" value="上传"/>
</form>
</body>
arraySuccess.jsp
- <body>
- <b>使用数组上传成功s:iterator</b>
- <s:iteratorvalue="imageFileName"status="st">
- 第<s:propertyvalue="#st.getIndex()+1"/>个图片:<br/>
- [img]image/<s:propertyvalue="imageFileName[#st.getIndex()][/img]"/>
- </s:iterator>
- <br/><b>使用数组上传成功c:foreach</b>
- <c:forEachvar="fn"items="${imageFileName}"varStatus="st">
- 第${st.index+1}个图片:<br/>
- <imgsrc="image/${fn}"/>
- </c:forEach>
- </body>
<body>
<b>使用数组上传成功s:iterator</b>
<s:iterator value="imageFileName" status="st">
第<s:property value="#st.getIndex()+1"/>个图片:<br/>
[img]image/<s:property value="imageFileName[#st.getIndex()][/img]"/>
</s:iterator>
<br/><b>使用数组上传成功c:foreach</b>
<c:forEach var="fn" items="${imageFileName}" varStatus="st">
第${st.index+1}个图片:<br/>
<img src="image/${fn}"/>
</c:forEach>
</body>
案例:使用List上传多个文件
action.java
- packagecom.sh.action;
- importjava.io.File;
- importjava.io.FileInputStream;
- importjava.io.FileOutputStream;
- importjava.util.List;
- importjava.util.Random;
- importjavax.servlet.Servlet;
- importorg.apache.struts2.ServletActionContext;
- importcom.opensymphony.xwork2.ActionSupport;
- publicclassListUploadextendsActionSupport{
- privateList<File>doc;
- privateList<String>docContentType;
- privateList<String>docFileName;
- privateStringpath;
- @Override
- publicStringexecute()throwsException{
- for(inti=0;i<doc.size();i++){
- docFileName.set(i,getFileName(docFileName.get(i)));
- FileOutputStreamfos=newFileOutputStream(getPath()+"\\"+docFileName.get(i));
- Filefile=doc.get(i);
- FileInputStreamfis=newFileInputStream(file);
- byte[]b=newbyte[1024];
- intlength=0;
- while((length=fis.read(b))>0){
- fos.write(b,0,length);
- }
- }
- returnSUCCESS;
- }
- publicStringgetFileName(StringfileName){
- intposition=fileName.lastIndexOf(".");
- Stringextension=fileName.substring(position);
- intradom=newRandom().nextInt(1000);
- return""+System.currentTimeMillis()+radom+extension;
- }
- publicStringgetPath(){
- returnServletActionContext.getRequest().getRealPath(path);
- }
package com.sh.action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.List;
import java.util.Random;
import javax.servlet.Servlet;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class ListUpload extends ActionSupport {
private List<File> doc;
private List<String> docContentType;
private List<String> docFileName;
private String path;
@Override
public String execute() throws Exception {
for(int i=0;i<doc.size();i++){
docFileName.set(i, getFileName(docFileName.get(i)));
FileOutputStream fos=new FileOutputStream(getPath()+"\\"+docFileName.get(i));
File file=doc.get(i);
FileInputStream fis=new FileInputStream(file);
byte [] b=new byte[1024];
int length=0;
while((length=fis.read(b))>0){
fos.write(b,0,length);
}
}
return SUCCESS;
}
public String getFileName(String fileName){
int position=fileName.lastIndexOf(".");
String extension=fileName.substring(position);
int radom=new Random().nextInt(1000);
return ""+System.currentTimeMillis()+radom+extension;
}
public String getPath() {
return ServletActionContext.getRequest().getRealPath(path);
}
strust.xml
- <actionname="listUpload"class="com.sh.action.ListUpload">
- <interceptor-refname="fileUpload">
- <paramname="allowedTypes">
- image/x-png,image/gif,image/bmp,image/jpeg
- </param>
- <paramname="maximumSize">
- 10240000
- </param>
- </interceptor-ref>
- <interceptor-refname="defaultStack"/>
- <paramname="path">/image</param>
- <resultname="success">/listSuccess.jsp</result>
- <resultname="input">/listupload.jsp</result>
- </action>
<action name="listUpload" class="com.sh.action.ListUpload"> <interceptor-ref name="fileUpload"> <param name="allowedTypes"> image/x-png,image/gif,image/bmp,image/jpeg </param> <param name="maximumSize"> 10240000 </param> </interceptor-ref> <interceptor-ref name="defaultStack"/> <param name="path">/image</param> <result name="success">/listSuccess.jsp</result> <result name="input">/listupload.jsp</result> </action>
listUpload.jsp
- <body>
- ===========List多文件上传=================
- <formaction="${pageContext.request.contextPath}/listUpload.action"
- enctype="multipart/form-data"method="post">
- 文件1:<inputtype="file"name="doc"/><br/>
- 文件2:<inputtype="file"name="doc"/><br/>
- 文件3:<inputtype="file"name="doc"/>
- <inputtype="submit"value="上传"/>
- </form>
- <s:fielderror/>
- <s:formaction="listUpload"enctype="multipart/form-data">
- <s:filename="doc"label="选择上传的文件"/>
- <s:filename="doc"label="选择上传的文件"/>
- <s:filename="doc"label="选择上传的文件"/>
- <s:submitvalue="上传"/>
- </s:form>
- </body>
<body>
===========List 多文件上传=================
<form action="${pageContext.request.contextPath }/listUpload.action"
enctype="multipart/form-data" method="post">
文件1:<input type="file" name="doc"/><br/>
文件2:<input type="file" name="doc"/><br/>
文件3:<input type="file" name="doc"/>
<input type="submit" value="上传"/>
</form>
<s:fielderror/>
<s:form action="listUpload" enctype="multipart/form-data">
<s:file name="doc" label="选择上传的文件"/>
<s:file name="doc" label="选择上传的文件"/>
<s:file name="doc" label="选择上传的文件"/>
<s:submit value="上传"/>
</s:form>
</body>
listSuccess.jsp
- <body>
- <h3>使用List上传多个文件s:iterator显示</h3>
- <s:iteratorvalue="docFileName"status="st">
- 第<s:propertyvalue="#st.getIndex()+1"/>个图片:
- <br/>
- <imgsrc="image/<s:propertyvalue="docFileName.get(#st.getIndex())"/>"/><br/>
- </s:iterator>
- <h3>使用List上传多个文件c:foreach显示</h3>
- <c:forEachvar="fn"items="${docFileName}"varStatus="st">
- 第${st.index}个图片<br/>
- <imgsrc="image/${fn}"/>
- </c:forEach>
- </body>
<body>
<h3>使用List上传多个文件 s:iterator显示</h3>
<s:iterator value="docFileName" status="st">
第<s:property value="#st.getIndex()+1"/>个图片:
<br/>
<img src="image/<s:property value="docFileName.get(#st.getIndex())"/>"/><br/>
</s:iterator>
<h3>使用List上传多个文件 c:foreach显示</h3>
<c:forEach var="fn" items="${docFileName}" varStatus="st">
第${st.index}个图片<br/>
<img src="image/${fn}"/>
</c:forEach>
</body>
案例:Struts2 文件下载
- Struts2支持文件下载,通过提供的stram结果类型来实现。指定stream结果类型是,还需要指定inputName参数,此参数表示输入流,作为文件下载入口。
Struts2支持文件下载,通过提供的stram结果类型来实现。指定stream结果类型是,还需要指定inputName参数,此参数表示输入流,作为文件下载入口。
简单文件下载 不含中文附件名
- packagecom.sh.action;
- importjava.io.InputStream;
- importorg.apache.struts2.ServletActionContext;
- importcom.opensymphony.xwork2.ActionSupport;
- publicclassMyDownloadextendsActionSupport{
- privateStringinputPath;
- //注意这的方法名在struts.xml中要使用到的
- publicInputStreamgetTargetFile(){
- System.out.println(inputPath);
- returnServletActionContext.getServletContext().getResourceAsStream(inputPath);
- }
- publicvoidsetInputPath(StringinputPath){
- this.inputPath=inputPath;
- }
- @Override
- publicStringexecute()throwsException{
- //TODOAuto-generatedmethodstub
- returnSUCCESS;
- }
- }
package com.sh.action;
import java.io.InputStream;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class MyDownload extends ActionSupport {
private String inputPath;
//注意这的 方法名 在struts.xml中要使用到的
public InputStream getTargetFile() {
System.out.println(inputPath);
return ServletActionContext.getServletContext().getResourceAsStream(inputPath);
}
public void setInputPath(String inputPath) {
this.inputPath = inputPath;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return SUCCESS;
}
}
Struts.xml
- <actionname="mydownload"class="com.sh.action.MyDownload">
- <!--给action中的属性赋初始值-->
- <paramname="inputPath">/image/1347372060765110.jpg</param>
- <!--给注意放回后的type类型-->
- <resultname="success"type="stream">
- <!--要下载文件的类型-->
- <paramname="contentType">image/jpeg</param>
- <!--action文件输入流的方法getTargetFile()-->
- <paramname="inputName">targetFile</param>
- <!--文件下载的处理方式包括内联(inline)和附件(attachment)两种方式--->
- <paramname="contentDisposition">attachment;filename="1347372060765110.jpg"</param>
- <!---下载缓冲区的大小-->
- <paramname="bufferSize">2048</param>
- </result>
- </action>
<action name="mydownload" class="com.sh.action.MyDownload"> <!--给action中的属性赋初始值--> <param name="inputPath">/image/1347372060765110.jpg</param> <!--给注意放回后的 type类型--> <result name="success" type="stream"> <!--要下载文件的类型--> <param name="contentType">image/jpeg</param> <!--action文件输入流的方法 getTargetFile()--> <param name="inputName">targetFile</param> <!--文件下载的处理方式 包括内联(inline)和附件(attachment)两种方式---> <param name="contentDisposition">attachment;filename="1347372060765110.jpg"</param> <!---下载缓冲区的大小--> <param name="bufferSize">2048</param> </result> </action>
down.jsp
- <body>
- <h3>Struts2的文件下载</h3><br>
- <ahref="mydownload.action">我要下载</a>
- </body>
<body>
<h3>Struts 2 的文件下载</h3> <br>
<a href="mydownload.action">我要下载</a>
</body>
在ie下 可以看到会打开一个 文件下载对话框 有 打开 保存 取消 按钮
google中 没有了
文件下载,支持中文附件名
action
- packagecom.sh.action;
- importjava.io.InputStream;
- importorg.apache.struts2.ServletActionContext;
- importcom.opensymphony.xwork2.ActionSupport;
- publicclassDownLoadActionextendsActionSupport{
- privatefinalStringDOWNLOADPATH="/image/";
- privateStringfileName;
- //这个方法也得注意struts.xml中也会用到
- publicInputStreamgetDownLoadFile(){
- returnServletActionContext.getServletContext().getResourceAsStream(DOWNLOADPATH+fileName);
- }
- //转换文件名的方法在strust.xml中会用到
- publicStringgetDownLoadChineseFileName(){
- StringchineseFileName=fileName;
- try{
- chineseFileName=newString(chineseFileName.getBytes(),"ISO-8859-1");
- }catch(Exceptione){
- e.printStackTrace();
- }
- returnchineseFileName;
- }
- @Override
- publicStringexecute()throwsException{
- //TODOAuto-generatedmethodstub
- returnSUCCESS;
- }
- publicStringgetFileName(){
- returnfileName;
- }
- publicvoidsetFileName(StringfileName){
- this.fileName=fileName;
- }
- }
package com.sh.action;
import java.io.InputStream;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class DownLoadAction extends ActionSupport {
private final String DOWNLOADPATH="/image/";
private String fileName;
//这个方法 也得注意 struts.xml中也会用到
public InputStream getDownLoadFile(){
return ServletActionContext.getServletContext().getResourceAsStream(DOWNLOADPATH+fileName);
}
//转换文件名的方法 在strust.xml中会用到
public String getDownLoadChineseFileName(){
String chineseFileName=fileName;
try {
chineseFileName=new String(chineseFileName.getBytes(),"ISO-8859-1");
} catch (Exception e) {
e.printStackTrace();
}
return chineseFileName;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return SUCCESS;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
}
struts.xml
- <actionname="download"class="com.sh.action.DownLoadAction">
- <paramname="fileName">活动主题.jpg</param>
- <resultname="success"type="stream">
- <paramname="contentType">image/jpeg</param>
- <!--getDownLoadFile()这个方法--->
- <paramname="inputName">downLoadFile</param>
- <paramname="contentDisposition">attachment;filename="${downLoadChineseFileName}"</param>
- <paramname="bufferSize">2048</param>
- </result>
- </action>
<action name="download" class="com.sh.action.DownLoadAction"> <param name="fileName">活动主题.jpg</param> <result name="success" type="stream"> <param name="contentType">image/jpeg</param> <!-- getDownLoadFile() 这个方法---> <param name="inputName">downLoadFile</param> <param name="contentDisposition">attachment;filename="${downLoadChineseFileName}"</param> <param name="bufferSize">2048</param> </result> </action>
down1.jsp
- <body>
- <h3>Struts2的文件下载</h3><br>
- <ahref="download.action">我要下载</a>
- </body>