上面是jsp页面的form表单,该表单用的是struts2的标签。这里需要注意的是 method="post" enctype="multipart/form-data" 注意不要写错
下面看上传文件对应的action类:
public class UploadAction extends ActionSupport {
private File <span style="color:#ff0000;">ppt</span>;//该属性对应表单 <span style="font-family: Arial, Helvetica, sans-serif;"><s:file name="<span style="color:#ff0000;">ppt</span>" label="Ppt"></s:file>的name属性</span>
private String <span style="color:#ff0000;">ppt</span><span style="color:#000099;">ContentType</span>;
private String <span style="color:#ff0000;">ppt</span><span style="color:#3333ff;">FileName</span>;
private String pptDesc;
/*
<span style="white-space:pre"> </span>属性 ppt、pptContentType、pptFileName 这三个属性是必须的而且其名字的命名方式是一定的,即:file,fileContentType,fileFileName的形式
<span style="white-space:pre"> </span>*/
@Override
public String execute() throws Exception {
ServletContext servletContext = ServletActionContext.getServletContext();
System.out.println(ppt);
System.out.println(pptContentType);
System.out.println(pptDesc);
System.out.println(pptFileName);
String dir = servletContext.getRealPath("/files/"+pptFileName);
System.out.println(dir);
FileOutputStream fos = new FileOutputStream(dir);
FileInputStream fis = new FileInputStream(ppt);
byte []buffer = new byte[1024];
int len = 0;
while((len = fis.read(buffer)) != -1){
fos.write(buffer, 0, len);
}
fis.close();
fos.close();
}
return success;
}
//属性对应的getter和setter方法省略
}
上面的例子只是上传单个文件,下面看看同时上传多个文件的例子
下面是jsp文件的form表单
<span style="white-space:pre"> </span><s:form action="testUpload" method="post" enctype="multipart/form-data">
<s:file<span style="color:#ff0000;"> name="ppt"</span> label="Ppt"></s:file>
<s:textfield name="<span style="background-color: rgb(255, 255, 255);"><span style="color:#ff0000;">pptDesc[0]</span></span>" label="pptDesc"></s:textfield>
<s:file <span style="color:#ff0000;">name="ppt"</span> label="Ppt"></s:file>
<s:textfield name="<span style="color:#ff0000;">pptDesc[1]</span>" label="pptDesc"></s:textfield>
<s:file <span style="color:#ff0000;">name="ppt"</span> label="Ppt"></s:file>
<s:textfield name="<span style="color:#ff0000;">pptDesc[2]</span>" label="pptDesc"></s:textfield>
<s:submit></s:submit>
</s:form>
jsp文件需要注意的就是标红的地方name的属性值必须一致。
下面看看action类:
package com.mxf.action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.List;
import javax.servlet.ServletContext;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class UploadAction extends ActionSupport {
/**
*
*/
private static final long serialVersionUID = 1L;
private List<File> ppt;
private List<String> pptContentType;
private List<String> pptFileName;
private List<String> pptDesc;
@Override
public String execute() throws Exception {
ServletContext servletContext = ServletActionContext.getServletContext();
for(int i=0;i<ppt.size();i++){
System.out.println(ppt.get(i));
System.out.println(pptContentType.get(i));
System.out.println(pptDesc.get(i));
System.out.println(pptFileName.get(i));
String dir = servletContext.getRealPath("/files/"+pptFileName.get(i));
System.out.println(dir);
FileOutputStream fos = new FileOutputStream(dir);
FileInputStream fis = new FileInputStream(ppt.get(i));
byte []buffer = new byte[1024];
int len = 0;
while((len = fis.read(buffer)) != -1){
fos.write(buffer, 0, len);
}
fis.close();
fos.close();
}
return success;
}
public List<File> getPpt() {
return ppt;
}
public void setPpt(List<File> ppt) {
this.ppt = ppt;
}
public List<String> getPptContentType() {
return pptContentType;
}
public void setPptContentType(List<String> pptContentType) {
this.pptContentType = pptContentType;
}
public List<String> getPptFileName() {
return pptFileName;
}
public void setPptFileName(List<String> pptFileName) {
this.pptFileName = pptFileName;
}
public List<String> getPptDesc() {
return pptDesc;
}
public void setPptDesc(List<String> pptDesc) {
this.pptDesc = pptDesc;
}
}
因为同时上传多个文件,所以这里接收文件action的属性用的是list集合,同时在处理文件的时候加一个for循环就可以了。
如果上传成功后需要回显的时候,因为file文件默认不显示其路径,故不需要特别注意什么,不过在其信息一栏可以利用struts2的OGNL来回显具体细节信息。具体看下面的图片。第一个是上传时的界面,第二个是没有在<s:textfield name="pptDesc" label="pptDesc"></s:textfield>的name属性里面加 pptDesc[0],第三个即
<s:textfield name="pptDesc[0]" label="pptDesc"></s:textfield>加了pptDesc[0]后的回显。