本案主要完成使用阿帕奇commons-fileupload组件完成文件上传功能(浏览器端上传到服务器)
1 首先准备这两个apache组件导入项目
2 前端页面简单写了写
其中要注意的地方时,表单提交Form内内容enctype必须加上,且内容必须是multipart/form-data,表示二进制方式提交
另外提交方式必须是post
<form action="${pageContext.request.contextPath}/fileUpload" method="POST" enctype="multipart/form-data">
username:<input type="text" name="username" /><br>
上传文件:<input type="file" name="fileName" /><br>
<input type="submit" value="文件上传" /><br>
</form>
3 开始fileUploadServlet实现
重点是三个步骤:a 创建文件工厂 b 使用servletFileUpload核心类解析Request c 使用FileItem类获取上传内容
//1 创建磁盘文件工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(1024*1024);//文件上传缓存大小设定,单位为byte
String tempPath=this.getServletContext().getRealPath("temp");//磁盘缓存文件保存路径设定,这里设置为项目下temp文件夹绝对路径
factory.setRepository(new File(tempPath));//这两项设定也可以在构造函数中表现
//2创建阿帕奇文件上传核心类
ServletFileUpload upload = new ServletFileUpload(factory);
//2.1判断form提交的是否是一个文件上传form
if(ServletFileUpload.isMultipartContent(request)){
try {
//2.2解析request为一个集合,元素为FileItem
List<FileItem> parseRequest = upload.parseRequest(request);
//2.3设置解析到的文件名编码格式
upload.setHeaderEncoding("UTF-8");
//2.4遍历解析集合,如果为文件,则
for(FileItem fileItem:parseRequest){
//判断是否文件,结果为“true”就是普通表单,如果为“false”则是文件
if(fileItem.isFormField()){
String fieldName = fileItem.getFieldName();//获取表单name属性名
System.out.println(fileItem.getString("UTF-8"));//获取表单value值,并设定编码方式
}else{
String name = fileItem.getName();//获取所上传文件的名称
InputStream in = fileItem.getInputStream();//获得上传文件字节流
//BufferedInputStream bis = new BufferedInputStream(in);
//创建输出文件
String outPath = this.getServletContext().getRealPath("uploadfolder/"+name);
FileOutputStream out = new FileOutputStream(new File(outPath));
//BufferedOutputStream bos = new BufferedOutputStream(out);
//使用IOUtils工具输出, 也就是copy文件
IOUtils.copy(in, out);
System.out.println("上传完毕");
//文件上传完毕,清空缓存资料夹内容
in.close();
out.close();
fileItem.delete();
}
}
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
//如果不是文件上传类型,则采用普通表单获取方式
request.setCharacterEncoding("UTF-8");
String parameter = request.getParameter("username");
System.out.println(parameter);
}
|