Struts2实现多个文件上传的示例


上篇博客实现的是单个文件上传,这次实现多个文件上传。其中命名规范跟上篇博客一样。

思路如下:多个文件上传,需要注入多个文件对象中,所以Action中定义多个文件,因此是定义文件数组。在这个实例中,我们应用List来实现。

其实,在上传文件,无论是单个文件还是多个文件,就是从上传的临时文件或文件组(循环)读到本地中。

因此,javaio基础是关键。遇到文件的读写,发现io流基础不牢固,回头又重新看了马士兵的io流并实践io流小例子。其中io流的总结参见博客Java IO流分析整理》

在多文件上传中,利用缓冲流进行写入文件中。实例如下:

  1. package com.upload;  

  2. import java.io.BufferedReader;  

  3. import java.io.BufferedWriter;  

  4. import java.io.File;  

  5. import java.io.FileInputStream;  

  6. import java.io.FileOutputStream;  

  7. import java.io.FileReader;  

  8. import java.io.FileWriter;  

  9. import java.util.List;  

  10. import java.util.Map;  

  11. import javassist.bytecode.Descriptor.Iterator;  

  12. import org.apache.struts2.ServletActionContext;  

  13. import com.opensymphony.xwork2.ActionSupport;  

  14. /*

  15. * 多文件上传

  16. */

  17. publicclass MultiUpload extends ActionSupport {  

  18. private List<File> file;  

  19. private List<String> fileFileName;  

  20. private List<String> fileContentType;  

  21. //每个文件的大小

  22. private Long maximumSize;  

  23. //文件的类型

  24. private String allowedTypes;  

  25. public Long getMaximumSize() {  

      return maximumSize;  

  26. }  

  27. publicvoid setMaximumSize(Long maximumSize) {  

  28.   this.maximumSize = maximumSize;  

  29. }  

  30. public String getAllowedTypes() {  

  31.   return allowedTypes;  

  32. }  

  33. publicvoid setAllowedTypes(String allowedTypes) {  

  34.   this.allowedTypes = allowedTypes;  

  35. }  

  36. public List<File> getFile() {  

  37.   return file;  

  38. }  

  39. publicvoid setFile(List<File> file) {  

  40.   this.file = file;  

  41. }  

  42. public List<String> getFileFileName() {  

  43.   return fileFileName;  

  44. }  

  45. publicvoid setFileFileName(List<String> fileFileName) {  

  46.   this.fileFileName = fileFileName;  

  47. }  

  48. public List<String> getFileContentType() {  

  49.   return fileContentType;  

  50. }  

  51. publicvoid setFileContentType(List<String> fileContentType) {  

  52.   this.fileContentType = fileContentType;  

  53. }  

  54. public String execute() throws Exception {  

  55.        String s=null;  

  56.        File uploadFile =new File(ServletActionContext.getServletContext().getRealPath("file"));  

  57. if(!uploadFile.exists())  

  58.        {  

  59.            uploadFile.mkdir();  

  60.        }  

  61. boolean[] flags=null;  

  62. //用于标识

  63.        flags=newboolean[file.size()];  

  64. //规定的上传文件格式分解

  65.        String[] fileType =allowedTypes.split(",");  

  66. //      判断文件大小是否符合条件

  67. for(int i=0;i<file.size();i++)  

  68.        {  

  69.            flags[i]=false;  

  70. //若是上传的文件大小大于规定的长度

  71. if(maximumSize<file.get(i).length())  

  72.            {  

  73.                Map request=(Map)ServletActionContext.getContext().get("request");  

  74.                request.put("errorMessage", "文件太大,不能上传");  

  75. return"input";  

  76.            }  

  77. //判断上传的文件的类型

  78. for(int j=0;j<fileType.length;j++)  

  79.            {  

  80. if(fileContentType.get(i).equals(fileType[j]))  

  81.                {  

  82.                    flags[i]=true;  

  83.                }  

  84.            }  

  85.        }  

  86. //然后判断是否存在类型的不合格

  87. for(int k=0;k<flags.length;k++)  

  88.        {  

  89. if(flags[k]==false)  

  90.            {  

  91.                Map request=(Map)ServletActionContext.getContext().get("request");  

  92.                request.put("errorMessage", "文件类型不符合");  

  93. return"input";  

  94.            }  

  95.        }  

  96. //把临时文件保存为本地文件

  97. for(int i=0;i<file.size();i++)  

  98.        {  

  99.            FileReader fis=new FileReader(file.get(i));  

  100.            FileWriter fos=new FileWriter(uploadFile +"\\"+fileFileName.get(i));  

  101.            BufferedReader br=new BufferedReader(fis);  

  102.            BufferedWriter bw=new BufferedWriter(fos);  

  103. while((s=br.readLine())!=null)  

  104.            {  

  105.                bw.write(s);  

  106.            }  

  107.        }  

  108. return"success";  

  109.    }  

  110. }  

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配置文件,和单个文件上传配置类似如下:

  1. <actionname="multiUpload"class="com.upload.MultiUpload">

  2. <resultname="success">success.jsp</result>

  3. <resultname="error">error.jsp</result>

  4. <resultname="input">input.jsp</result>

  5. <paramname="maximumSize">1000000</param>

  6. <paramname="allowedTypes">application/msword,text/plain</param>

  7. </action>

 <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页面如下:

  1. <formaction="multiUpload"enctype="multipart/form-data"method="post">

  2. <inputtype="file"name="file"><br>

  3. <inputtype="file"name="file"><br>

  4. <inputtype="file"name="file"><br>

  5. <inputtype="submit"value="登录">

  6. </form>

<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中进行配置:

  1. <interceptor-refname="fileUpload">

  2. <paramname="maximumSize">1000000</param>

  3. <paramname="allowedTypes">application/msword,text/plain</param>

  4. </interceptor-ref>

  5. <interceptor-refname="defaultStack"></interceptor-ref>