下面是具体的利用Apache Commons FileUpload组件来上传文件,并获取普通表单域的数据。
e.g
Servlet代码:
String fileDir = this.getServletContext().getRealPath("temp/");
String localFileName = "";
String serverFileName = "";
String serverFilePath = "";
if(ServletFileUpload.isMultipartContent(request)) {
DiskFileItemFactory factory = new DiskFileItemFactory(); // 基于磁盘文件项目创建一个工厂对象
//factory.setSizeThreshold(20*1024);
factory.setRepository(factory.getRepository());
ServletFileUpload upload = new ServletFileUpload(factory); // 创建一个新的文件上传对象
int size = 10*1024*1024; // 最大上传文件,不超过10M
List formlists = null;
FileItem formitem;
try{
formlists = upload.parseRequest(request); // 解析上传请求
}catch(FileUploadException e){
e.printStackTrace();
}
Iterator iter = formlists.iterator(); // 枚举方法
while(iter.hasNext()) {
formitem = (FileItem)iter.next(); // 获取FileItem对象
if(!formitem.isFormField()) { // 判断是否为文件域
if(formitem.getName()!=null && !formitem.getName().equals("")) { // 判断是否选择了文件
long upFileSize = formitem.getSize(); // 上传文件大小
if (upFileSize > size) {
out.print("<script>alert('上传文件太大![<100M]')</script>");
return;
}
localFileName = formitem.getName(); // 获取文件名
int ii = localFileName.lastIndexOf(".");
String sExt = localFileName.substring(ii,localFileName.length());//取文件名的后缀
if ((!sExt.equals(".xls")) && (!sExt.equals(".xlsx"))) {
out.print("<script>alert('请选择excel文件!')</script>");
return;
}
//得到不重复的文件名,这一步是为了防止同时上传两个同文件名的excel而做的,避免文件名重复
Date dt = new Date(System.currentTimeMillis());
SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMddHHmmssSSS");
serverFileName = fmt.format(dt);
serverFileName = serverFileName + sExt;
//如果不存在该目录,则新建一个
File dir =new File(fileDir);
if (!dir.exists()) {
dir.mkdirs();
}
serverFilePath = fileDir+"\\"+serverFileName;
File serverFile = new File(serverFilePath);
try {
formitem.write(serverFile);
}catch(Exception e) {
e.printStackTrace();
}
}else {
out.print("<script>alert('没有选择文件!')</script>");
return;
}
}else {
try {
if("column".equals(formitem.getFieldName())) {
column = Integer.parseInt(formitem.getString("gb2312").trim());
//System.out.println(column);
}
}catch (NumberFormatException e) {
e.printStackTrace();
return;
}
}
}
HTML代码:
<form enctype="multipart/form-data" id="form1" name="form1" action="UploadServlet" method="post">
<input type="file" id="uploadfile" name="uploadfile" />
<input type="text" name="column" />
<input type="submit" value="上传" name="submit">
</form>
主要功能是,上传excel文件到/temp/目录下,为了测试获取普通表单域的值,放置了一个name为column的text。