注:该方法需要用到commons-fileupload-1.2.2.jar和commons-io-2.4.jar两个包,自行下载。
首先,需要在form表单中设置enctype="multipart/form-data"属性,就能实现文件上传,但是由于enctype="multipart/form-data"是以二进制的数据格式传输,所以在servlet中无法通过request.getParameter("name")获得值。具体方法如下(红色加粗表示对上传文件格式的判断,可自行选择):
List fileType = newArrayList();
fileType.add("gif");
fileType.add("jpg");
fileType.add("png");
fileType.add("rar");
request.setCharacterEncoding("utf-8");
StringuploadFileName="";//上传的文件名
StringfieldName="";//表单字段元素的name属性值
//请求信息中的内容是否是multipart类型
booleanisMultipart =ServletFileUpload.isMultipartContent(request);
//上传文件的存储路径(服务器文件系统上的绝对文件路径)
StringuploadFilePath =request.getSession().getServletContext().getRealPath("upload/");//此时需要在WebRoot下创建一个“upload"文件夹
if(isMultipart) {
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = newServletFileUpload(factory);
upload.setSizeMax(1024 *1024*20);//20M大小
try {
//解析form表单中所有文件
List items =upload.parseRequest(request);
Iterator iter =items.iterator();
while(iter.hasNext()) {//依次处理每个文件
FileItem item = (FileItem)iter.next();
String fileName =item.getName();
if(item.isFormField()){//如果是普通表单输入域
fieldName =item.getFieldName();//表单字段的name属性值
if(fieldName.equals("fname")){//fname为form表单里对应的name的值
lastName =item.getString("UTF-8");//lastName用来接收与name相对应的value的值
}
} else {//如果是文件上传域
Stringext =fileName.substring(fileName.lastIndexOf(".") + 1);
if (fileType.contains(ext)){
if (fileName != null&& !fileName.equals("")) {
File fullFile = newFile(item.getName());
File saveFile = newFile(uploadFilePath,fullFile.getName());
item.write(saveFile);//上传
uploadFileName =fullFile.getName();
}
} else {
response.sendRedirect("........");
}
}
}
} catch (Exception e) {
response.sendRedirect("..........");
}
}