下面是具體的利用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。