servlet利用Commons-FileUpload组件进行保存
1. 引入jar包:commons-fileupload-1.3.3.jar
commons-io-2.5.jar
2. jsp页面布局
<body>
<form action="upload" method="post" enctype="multipart/form-data">
文件:<input type="file" name="photo"/>
<input type="submit" value="提交"/>
</form>
</body>
3.servlet中组件应用
package hyy.test.servlet;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Arrays;
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.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class Fileupload extends HttpServlet {
private static final long serialVersionUID = 1L;
/*
* 临时保存的路径
*/
private String tempPath="WEB-INF/temp";
/*
* 文件存储路径
*/
private String savePath="WEB-INF/upload";
/*
* 上传文件的类型集合
*/
private List<String> fileType=Arrays.asList("jpg","gif","bmp","png","jpeg","ico");
/*
* 项目的根路径
*/
private String servletPath=null;
/*
* 完整请求最大准许的图片数
*/
private int sizeMax=3;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
/*
* 解决乱码问题
*/
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
/*
* 定义输出函数
*/
PrintWriter out=resp.getWriter();
/*
* 判断提交的表单是否是multipart/form-data类型,利用ServletFileUpload.isMultipartContent(req)来验证
*/
Boolean isMultipart=ServletFileUpload.isMultipartContent(req);
if(!isMultipart) {
/*
* 如果不是,按照普通方法获取form表单的值:req.getParameter(name)
* 注意:表单一旦写成Multipart/form-data编码类型,req就得不到值,也就是值传递不成功,
* 如果用FileUpload获取表单值,又会特别麻烦,所以当表单不上传文件时,不要用Multipart/form-data
*/
return;
} else {
/*
* 是Multipart类型
*/
try {
servletPath=getServletContext().getRealPath("/");
/*
* 定义工厂函数
* ServletFileUpload类用于实现文件上传操作
* 设置工厂的缓冲区大小为1024K
* 超过缓冲区大小,将把文件存放在临时文件中
* 设置单个文件上传的最大值
* 设置请求消息实体内容的最大准许大小
* 设置浏览器上传给WEB服务器的各个表单字段的描述头内容的编码格式
*/
DiskFileItemFactory factory=new DiskFileItemFactory();
ServletFileUpload upload=new ServletFileUpload(factory);
factory.setSizeThreshold(1024*1024);
factory.setRepository(generateFile(servletPath,tempPath));
upload.setFileSizeMax(1024*1024);
upload.setSizeMax(1024*1024*sizeMax);
upload.setHeaderEncoding("utf-8");
/*
* 从from表单取得FileItem集合
* 对集合进行遍历
* 判断表单项是否是文件域 item.isFormField()
* 一般表单:
* 1. 获取表单名称
* 2. 获取表单值
* 3. 对表单值进行操作
* 文件域:
* 1. 获取上传文件的文件名,判断文件域是否为空
* 2. 获取文件的扩展名,判断文件类型是否正确
* 3. 全都合格之后,对文件进行保存
* 3.1 获取文件长度
*/
List<FileItem> items=upload.parseRequest(req);
for(FileItem item:items) {
if(item.isFormField()) {
String name=item.getFieldName();
String value=item.getString("utf-8");
out.print(name+":"+value);
} else {
String fileName=item.getName().substring(item.getName().lastIndexOf("/")+1);
if(fileName==null ||fileName.trim().equals("")) {
out.print("<script>alert('文件不能为空!');window.location.href='upload.jsp';</script>");
}
String type=item.getName().substring(item.getName().lastIndexOf(".")+1);
if(fileType.contains(type)) {
InputStream is=item.getInputStream();
byte buffer[]=new byte[1024];
String saveFileName=generateFileName(fileName);
savePath=generateSavePath(servletPath+savePath,saveFileName);
out.print("<script>alert(savePath);</script>");
int len=0;
FileOutputStream fos=new FileOutputStream(savePath+File.separator+saveFileName);
while((len=is.read(buffer))>0) {
fos.write(buffer,0,len);
}
is.close();
fos.close();
item.delete();
} else {
out.print("<script>alert('文件类型错误!');window.location.href='upload.jsp';</script>");
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
private String generateSavePath(String path, String fileName) {
int hashcode=fileName.hashCode();
int dir1=hashcode&15;
int dir2=(hashcode>>4)&0xf;
String savePath=path+File.separator+dir1+File.separator+dir2;
File file=new File(savePath);
if(!file.exists()) {
file.mkdirs();
}
return savePath;
}
private String generateFileName(String fileName) {
return UUID.randomUUID().toString()+"_"+fileName;
}
private File generateFile(String servletPath, String tempPath) {
if(!new File(servletPath+tempPath).isDirectory()) {
new File(servletPath+savePath).mkdirs();
}
return new File(servletPath+savePath);
}
}
浙公网安备 33010602011771号