文件上传效果图:
代码如下:
package star.july.upload;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FileUtils;
public class UploadServletDetail extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1、创建DiskFileItemFactory,设置缓存配置
DiskFileItemFactory factory = new DiskFileItemFactory(1*1024*1024,new File("f:/testwork/tempFiles"));
//2、创建ServletFileUpload对象,用于解析文件
ServletFileUpload sfu = new ServletFileUpload(factory);
//设置单个文件上传的最大大小为200KB
// sfu.setFileSizeMax(200*1024);
// sfu.setSizeMax(400*1024); //设置多文件上传总大小
//解决编码问题
sfu.setHeaderEncoding("utf-8");
//3、开始解析上传的文件
try{
List<FileItem> list = sfu.parseRequest(request);
//4、获取文件信息
// if(list!=null){
//遍历多个文件
for(FileItem item : list){
//接受非文件类型数据
if(item.isFormField()){
String na = item.getFieldName();
if("userName".equals(na)){
String string = item.getString("utf-8");
System.out.println("用户名:"+string);
}
if("eMail".equals(na)){
String string = item.getString("utf-8");
System.out.println("邮箱:"+string);
}
}
// FileItem item = list.get(0);
//限制文件类型
String contentType = item.getContentType();
//只能上传图片:image/xxxxx
/* if(!contentType.matches("image/[a-zA-Z0-9]+")){
//不允许类型
request.setAttribute("msg", "不支持该类型:"+contentType);
request.getRequestDispatcher("/upload.jsp").forward(request,response);
return;
}
*/
String fileName = item.getName();
//文件名不为空
if(fileName != null && !fileName.equals("")){
String name =null;
String newName =null;
//如果浏览器将路径也写进去,可用以下方法
//判断文件名是否包含一个可选的与系统有关的前缀 字符串,比如盘符,"/" 表示 UNIX 中的根目录,"\\\\" 表示 Microsoft Windows UNC 路径名。
/* if(fileName.contains(File.separator)){
//抽取文件名
name = fileName.substring(fileName.lastIndexOf(File.separator)+1);
System.out.println(name);
String end = fileName.substring(fileName.lastIndexOf(".")+1);
System.out.println(end);
//生成随机数,使文件名唯一
UUID ru = UUID.randomUUID();
newName = name+ru+"."+end;
}*/
System.out.println("文件名称:"+ fileName);
System.out.println("文件类型:"+item.getContentType());
System.out.println("文件大小:"+item.getSize());
System.out.println("文件内容:"+item.getInputStream());
//把上次的文件保存在服务器的硬盘中
FileUtils.copyInputStreamToFile(item.getInputStream(),
new File("f:/testwork/"+ fileName));
//删除临时文件
item.delete();
}
}
}catch(FileSizeLimitExceededException ivte){
request.setAttribute("msg", "超出可支持的单个文件的大小200KB");
request.getRequestDispatcher("upload.jsp").forward(request, response);
return;
}
catch(FileUploadException e){
e.printStackTrace();
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}