fileupload多文件上传
?? 以前做过单文件的上传 现在公司有需求要做多文件上传。我也是参考网上的资料,其实原理很简单,改用数组就得了。我是基于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" 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="上传更多..." onclick="addMore()">
??? ??? ??? ??? ??? </td>
??? ??? ??? ??? </tr>
??? ??? ??? ??? <tr>
??? ??? ??? ??? ??? <td>
??? ??? ??? ??? ??? ??? <s:submit value=" 确认 "></s:submit>
??? ??? ??? ??? ??? </td>
??? ??? ??? ??? ??? <td>
??? ??? ??? ??? ??? ??? <s:reset value=" 重置 "></s:reset>
??? ??? ??? ??? ??? </td>
??? ??? ??? ??? </tr>
??? ??? ??? </table>
??? ??? </s:form>
??? </body>
</html>