以前做过单文件的上传 现在公司有需求要做多文件上传。我也是参考网上的资料,其实原理很简单,改用数组就得了。我是基于struts2开发的 首先写个action
package org.usc.file;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import org.usc.utils.UploadConfigurationRead;
import com.opensymphony.xwork2.ActionSupport;
public class UploadAction extends ActionSupport
{
/**
*
*/
private static final long serialVersionUID = 1L;
private File[] upload;// 实际上传文件
private String[] uploadContentType; // 文件的内容类型
private String[] uploadFileName; // 上传文件名
private List<UploadFiles> uploadFiles = new ArrayList<UploadFiles>();
public String execute() throws Exception
{
try
{
String targetDirectory = ServletActionContext.getServletContext()
.getRealPath("/"+ UploadConfigurationRead.getInstance().getConfigItem("uploadFilePath").trim());// 获得路径
System.out.println(targetDirectory);
for (int i = 0; i < upload.length; i++)
{
String fileName = uploadFileName[i];// 上传的文件名
String type = uploadContentType[i];// 文件类型
String realName = UUID.randomUUID().toString()+ getExt(fileName);// 保存的文件名称,使用UUID+后缀进行保存
File target = new File(targetDirectory, realName);
FileUtils.copyFile(upload[i], target);// 上传至服务器的目录,一般都这样操作,
// 在把路径写入数据库即可
UploadFiles uf = new UploadFiles();// 创建文件
uf.setUploadContentType(type);
uf.setUploadFileName(fileName);
uf.setUploadRealName(realName);
uploadFiles.add(uf);// 添加到需要下载文件的List集合中
// uploadRealName[i]=UUID.randomUUID().toString();
// System.out.println("uploadRealName:"+uploadRealName[i]);
// for(File file:upload)
// {
// System.out.println("filename:"+file.getName());
// }
// System.out.println("filename:"+fileName);
// System.out.println("Ext:"+getExt(fileName));
// System.out.println("Type:"+type);
// System.out.println(target.getPath());
}
ServletActionContext.getRequest().setAttribute("uploadFiles",
uploadFiles);
} catch (Exception e)
{
e.printStackTrace();
addActionError(e.getMessage());
return INPUT;
}
return SUCCESS;
}
public File[] getUpload()
{
return upload;
}
public void setUpload(File[] upload)
{
this.upload = upload;
}
public String[] getUploadContentType()
{
return uploadContentType;
}
public void setUploadContentType(String[] uploadContentType)
{
this.uploadContentType = uploadContentType;
}
public String[] getUploadFileName()
{
return uploadFileName;
}
public void setUploadFileName(String[] uploadFileName)
{
this.uploadFileName = uploadFileName;
}
public static String getExt(String fileName)
{
return fileName.substring(fileName.lastIndexOf("."));
}
}
然后就是struts.xml配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.i18n.encoding" value="utf8" />
<!-- 这个是配置上传文件大小 默认的是2M 因为需求我改成10M-->
<constant name="struts.multipart.maxSize" value="104857600" />
<package name="file" namespace="/" extends="struts-default">
<action name="showUpload">
<result>/upload.jsp</result>
</action>
<action name="upload" class="org.usc.file.UploadAction">
<result name="input">/upload.jsp</result>
<!-- <result name="success">/upload_success.jsp</result>-->
<result name="success">/download.jsp</result>
</action>
<action name="download" class="org.usc.file.DownloadAction">
<result name="success" type="stream">
<param name="contentDisposition">attachment;filename="${fileName}"</param>
<param name="inputName">downloadFile</param>
</result>
</action>
</package>
</struts>
最后就是jsp页面了 其中用了js动态生成文本框
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>upload</title>
</head>
<body>
<script type="text/javascript">
<!--addMore函数可以提供上传多个文件上传-->
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 = "upload";
button.type = "button";
button.value = " 删除 ";
button.onclick = function()
{
td.removeChild(br);
td.removeChild(input);
td.removeChild(button);
}
td.appendChild(br);
td.appendChild(input);
td.appendChild(button);
}
</script>
<!--<h3><font color="red">上传文件类型后缀为doc,ppt,xls,pdf,txt,java,每个文件大小不能大于50M</font></h3>-->
<table align="center" width="50%">
<tr>
<td>
<!-- <s:actionerror cssStyle="color:red"/>-->
<s:fielderror cssStyle="color:red" />
</td>
</tr>
</table>
<s:form action="upload.action" theme="simple" method="post"
enctype="multipart/form-data">
<table align="center" width="50%" border="1">
<tr>
<td>
上传文件
</td>
<td id="more" >
<s:file name="upload"></s:file>
<input type="button" value="上传更多..." οnclick="addMore()">
</td>
</tr>
<tr>
<td>
<s:submit value=" 确认 "></s:submit>
</td>
<td>
<s:reset value=" 重置 "></s:reset>
</td>
</tr>
</table>
</s:form>
</body>
</html>