上篇博客实现的是单个文件上传,这次实现多个文件上传。其中命名规范跟上篇博客一样。
思路如下:多个文件上传,需要注入多个文件对象中,所以Action中定义多个文件,因此是定义文件数组。在这个实例中,我们应用List来实现。
其实,在上传文件,无论是单个文件还是多个文件,就是从上传的临时文件或文件组(循环)读到本地中。
因此,java的io基础是关键。遇到文件的读写,发现io流基础不牢固,回头又重新看了马士兵的io流并实践io流小例子。其中io流的总结参见博客《Java IO流分析整理》
在多文件上传中,利用缓冲流进行写入文件中。实例如下:
package com.upload;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.List;
import java.util.Map;
import javassist.bytecode.Descriptor.Iterator;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
/*
* 多文件上传
*/
public class MultiUpload extends ActionSupport {
private List<File> file;
private List<String> fileFileName;
private List<String> fileContentType;
//每个文件的大小
private Long maximumSize;
//文件的类型
private String allowedTypes;
public Long getMaximumSize() {
return maximumSize;
}
public void setMaximumSize(Long maximumSize) {
this.maximumSize = maximumSize;
}
public String getAllowedTypes() {
return allowedTypes;
}
public void setAllowedTypes(String allowedTypes) {
this.allowedTypes = allowedTypes;
}
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;
}
public String execute() throws Exception {
String s=null;
File uploadFile =new File(ServletActionContext.getServletContext().getRealPath("file"));
if(!uploadFile.exists())
{
uploadFile.mkdir();
}
boolean[] flags=null;
//用于标识
flags=new boolean[file.size()];
//规定的上传文件格式分解
String[] fileType =allowedTypes.split(",");
// 判断文件大小是否符合条件
for(int i=0;i<file.size();i++)
{
flags[i]=false;
//若是上传的文件大小大于规定的长度
if(maximumSize<file.get(i).length())
{
Map request=(Map)ServletActionContext.getContext().get("request");
request.put("errorMessage", "文件太大,不能上传");
return "input";
}
//判断上传的文件的类型
for(int j=0;j<fileType.length;j++)
{
if(fileContentType.get(i).equals(fileType[j]))
{
flags[i]=true;
}
}
}
//然后判断是否存在类型的不合格
for(int k=0;k<flags.length;k++)
{
if(flags[k]==false)
{
Map request=(Map)ServletActionContext.getContext().get("request");
request.put("errorMessage", "文件类型不符合");
return "input";
}
}
//把临时文件保存为本地文件
for(int i=0;i<file.size();i++)
{
FileReader fis=new FileReader(file.get(i));
FileWriter fos=new FileWriter(uploadFile +"\\"+fileFileName.get(i));
BufferedReader br=new BufferedReader(fis);
BufferedWriter bw=new BufferedWriter(fos);
while((s=br.readLine())!=null)
{
bw.write(s);
}
}
return "success";
}
}
struts.xml配置文件,和单个文件上传配置类似如下:
<action name="multiUpload" class="com.upload.MultiUpload">
<result name="success">success.jsp</result>
<result name="error">error.jsp</result>
<result name="input">input.jsp</result>
<param name="maximumSize">1000000</param>
<param name="allowedTypes">application/msword,text/plain</param>
</action>
Jsp页面如下:
<form action="multiUpload" enctype="multipart/form-data" method="post">
<input type="file" name="file"><br>
<input type="file" name="file"><br>
<input type="file" name="file"><br>
<input type="submit" value="登录">
</form>
对于上传文件中的文件大小和文件类型的限制,可以不用手动限制,在这两篇博客中,都自己手动在Action中编写代码,可以利用Struts2中的文件拦截器,直接在配置文件中的Action中进行配置:
<interceptor-ref name="fileUpload">
<param name="maximumSize">1000000</param>
<param name="allowedTypes">application/msword,text/plain</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>