利用 fileupload实现文件上传
前几天写了一个个人收藏夹的模块,用到了fileupload组件来实现文件的上传操作,今天整理了一下,与大家共享,以前看了一写例子,虽然能实现多个文件的上传,但数目是固定的,无法实现动态增加,即使实现了表单的增加,但相关的其他信息,例如手动增加的备注等,仍然不能实现。我只好挨个上传,但最后给用户显示的时候却好像多个文件上传似的,呵呵。好了。言归正传,如果已经下载了fileupload的jar包,那么我们就可以开始开始我们的文件上传之路了。
首先是写好jsp页面,需要注意的是:必须有一个类似这样的file选择框:<input name="WJLJ" type="file" value="" size="70"/>
然后我们在form中要这样写:<form method="post" action=”UploadServlet" id="GR_GRBG_GRSC_FORM" name=" FORM" ENCTYPE="multipart/form-data">,uploadservlet是我们自己写的servlet,用于实现文件的上传,也是我们要说的重点,能不能上传,全看它了。
/**
* 文件名称:UploadServlet.java;
* 包 结 构:com.zzxy.control;
*
* 版权信息:
*/
package com.zzxy.control;
import com.zzxy.common.MIS_Constant;
import com.zzxy.common.PdkUtils;
import com.zzxy.model.gr.GR_Agent_Helper;
import com.zzxy.model.vo.atom.VO_PT_GRSCWJ;
import java.util.*;
import java.io.*;
import java.util.Enumeration;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpSession;
import org.apache.commons.fileupload.*;
import com.zzxy.common.SecretCoder;
/**
* 类名称:FileUploadServlet;
* 类描述:自动执行文件上传,并将自动路由到Controller及相应的Agent组件
*
* 编 写 人:
* 编写日期:2004.09.09
* 修改人:
* 修改日期: 2004/09/11
* 修改原因:如果上传的为空和上传的不是文件时的处理
* 1.如果为空,则不执行写文件操作
* 2.如果上传的文件根本不存在,则抛出"上传文件失败"
* 版 本:
*/
public class UploadServlet
extends HttpServlet {
/**
* 名称:UploadServlet;
* 功能:
* 输入参数:
* 返回参数:无
*/
public UploadServlet() {
}
private static final String CONTENT_TYPE = "text/html; charset=GBK";
public void init(ServletConfig config) throws ServletException
{
super.init(config);
}
/**
* 名称:doPost
* 功能:
* 输入参数:HttpServletRequest request
* HttpServletResponse response
* 返回参数:无
*/
public void doPost(HttpServletRequest request,
HttpServletResponse response) throws IOException {
response.setContentType(CONTENT_TYPE);
try {
PrintWriter out = response.getWriter();
String strSizeMax = "10485760";
String strSizeThreshold = "4096";
//临时文件路径
String strUploads = this.getServletContext().getRealPath("/misdoc/mydocs");
//声明DiskFileUpload对象
DiskFileUpload diskFileUpload = new DiskFileUpload();
diskFileUpload.setSizeMax(new Long(strSizeMax).longValue());
diskFileUpload.setSizeThreshold(new Integer(strSizeThreshold).intValue());
//diskFileUpload.setRepositoryPath(strTmp);
List fileItems = diskFileUpload.parseRequest(request);
out.write("<form method=/"post/" action=/"");
out.print( PdkUtils.appRoot(request));
out.write("/HTTPController/" id=/"DATAFORM/" name=/"DATAFORM/"> /r/n");
String strSCRID = "";
String strSCJID = "";
String strGJZ = "";
String strMS = "";
String strWJLJ = "";
String strRequestID ="";
String strFlag ="First";
for (int m = 0; m < fileItems.size(); m++) {
FileItem fileItem = (FileItem) fileItems.get(m);
if(fileItem.isFormField())
{
//取到隐藏域
if (fileItem.getFieldName().equals("SCRID")) {
strSCRID = fileItem.getString();
}
if (fileItem.getFieldName().equals("SCJID")) {
strSCJID = fileItem.getString();
}
if (fileItem.getFieldName().equals("GJZ")) {
strGJZ= fileItem.getString();
}
if (fileItem.getFieldName().equals("MS")) {
strMS = fileItem.getString();
}
if (fileItem.getFieldName().equals("RequestID")) {
strRequestID = fileItem.getString();
}
if (fileItem.getFieldName().equals("Flag")) {
strFlag = fileItem.getString();
}
}
//忽略其他不是文件域的所有表单信息
if (!fileItem.isFormField()) {
strWJLJ = fileItem.getName().trim();
File fileName = new File(strWJLJ);
String filename = fileName.getName();
String strExtend = filename
.substring(filename.lastIndexOf(".")
, filename.length());
long size = fileItem.getSize();
if((strWJLJ==null||strWJLJ.equals("")) && size==0)
continue;
else
{
/向数据库中增加记录
GR_Agent_Helper gr_Agent_Helper = new GR_Agent_Helper();
VO_PT_GRSCWJ vo_PT_GRSCWJ = new VO_PT_GRSCWJ();
vo_PT_GRSCWJ.setWJID(gr_Agent_Helper.createPK(MIS_Constant.KEY_GRBG_GRSC_SCJID));
vo_PT_GRSCWJ.setSCJID(Long.parseLong(strSCJID));
filename=filename.replaceAll("'","’");
vo_PT_GRSCWJ.setWJMC(filename);
if(strGJZ.equals(""))
strGJZ = filename;
String strTime = getNowTime();
vo_PT_GRSCWJ.setGJZ(strGJZ);
vo_PT_GRSCWJ.setMS(strMS);
vo_PT_GRSCWJ.setWJDX(size);
vo_PT_GRSCWJ.setSCSJ(Long.parseLong(strTime));
gr_Agent_Helper.add(vo_PT_GRSCWJ);
///上传文件
strUploads = strUploads +"//"+ strSCRID;
if(!new File(strUploads).isDirectory())
new File(strUploads).mkdirs();
String strTmp = strUploads +"//";
diskFileUpload.setRepositoryPath(strTmp);
String filenewName = String.valueOf(vo_PT_GRSCWJ.getWJID())+"_"+strTime + strExtend;
strTmp = strTmp + filenewName;
String strWJID = String.valueOf(vo_PT_GRSCWJ.getWJID());
/
System.out.println("准备上传文件:"+strTmp);
//
fileItem.write(new File(strTmp));
//向后传递上传文件的信息
out.print("<input type='hidden' name=RequestID" + " value='" + strRequestID + "'>");
out.print("<input type='hidden' name=WJLJ" +" value='" + strWJLJ + "'>");
out.print("<input type='hidden' name=WJID" + " value='" + strWJID + "'>");
out.print("<input type='hidden' name=Flag" + " value='" + strFlag + "'>");
}
}
}
out.write("</form>/r/n");
out.write("<script language=/"javascript/">/r/n DATAFORM.target=/"_self/";/r/n DATAFORM.submit();/r/n");
out.write("</script>");
} catch (IOException ioe) {
forwardError("上传文件在存盘时失败,请检查指定的路径和读写权限!",request,response);
} catch (FileUploadException ie) {
forwardError("上传文件在存盘时失败,请检查您上传的文件大小!",request,response);
} catch (Exception e) {
forwardError("上传文件失败!",request,response);
System.out.println("UploadServlet: " + e.toString());
}
}
/**
* 名称:显示错误页面方法
* 功能:将错误信息显示在错误页面中
* 输入参数:String:errorMessage:错误信息
* HttpServletRequest:request:Http请求对象
* HttpServletResponse:response:Http响应对象
* 返回参数:
*/
protected void forwardError(String errorMessage,
HttpServletRequest request,
HttpServletResponse response) {
try {
//设置错误信息
request.setAttribute("ErrorMessage", errorMessage);
//将请求传递给显示错误信息的jsp显示
getServletContext()
.getRequestDispatcher("/error.jsp")
.forward(request, response);
}
catch (Exception Exp) {
}
}
/**
* 编 写 人
* 名 称:getNowTime
* 功 能:获取本机时间
* 输入参数:HttpServletRequest request
* 返回参数:void
*/
public String getNowTime() throws Exception {
try{
Calendar rightNow = Calendar.getInstance();
String month = String.valueOf(rightNow.get(Calendar.MONTH)+1);
String day =String.valueOf(rightNow.get(Calendar.DAY_OF_MONTH));
String hour =String.valueOf(rightNow.get(Calendar.HOUR_OF_DAY));
String minute =String.valueOf(rightNow.get(Calendar.MINUTE));
String secend =String.valueOf(rightNow.get(Calendar.SECOND));
if((rightNow.get(Calendar.MONTH)+1)<10)
month = "0"+month;
if(rightNow.get(Calendar.DAY_OF_MONTH)<10)
day = "0"+day;
if(rightNow.get(Calendar.HOUR_OF_DAY)<10)
hour = "0"+hour;
if(rightNow.get(Calendar.MINUTE)<10)
minute = "0"+minute;
if(rightNow.get(Calendar.SECOND)<10)
secend = "0"+secend;
String time = String.valueOf(rightNow.get(Calendar.YEAR))+month+day+hour+minute+secend;
return time;
} catch (Exception ex) {
throw ex;
}
}
}
我这里写完之后自动提交了一个action,实现了servlet的重定向,并存储了文件路径等信息,试试效果还可以,另外说明一下,vo是我们生成的一个用于存储文件信息的数据库表的vo,运行环境是jdev,采用框架是我们自己设计的框架结构,是不能直接运行的哦。