今天咱们来聊一聊Servlet3.0的文件上传,3.0JAVA源生支持文件上传。
文件上传,我们需要在表单或HTTPURLConnection中设置请求方式为POST并且还需要设置消息头enctype=”multipart/form-data”(作用是将文件对应的内容以二进制的形式传递给后台)
1、上传页面
下面看看我的上传的HTML页面:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件上传,支持图片的预览,多个图片上传等功能</title>
<script type="text/javascript">
var no=1;
//要显示图片的img的id必须showimg开头
//预览上传的图片
function preview(obj,id){
//判断是否支持FileReader
if (window.FileReader) {
var reader = new FileReader();
} else {
alert("您的设备不支持图片预览功能,如需该功能请升级您的设备!");
}
//获取文件
var file = obj.files[0];
var imageType = /^image\//;
//是否是图片
if (!imageType.test(file.type)) {
alert("请选择图片!");
//return;
}
//读取完成
reader.onload = function(e) {
//获取图片dom
var img = document.getElementById("previewImg"+id);
//图片路径设置为读取的图片
img.src = e.target.result;
};
reader.readAsDataURL(file);
}
//新增file标签
function addFile(dv_id) {
no++;
//var d=document.getElementById("dv_files");
var d=document.getElementById(dv_id);
var c=document.createElement("input");
c.setAttribute("type","file");
c.setAttribute("name","fn"+no);
c.setAttribute("onchange","preview(this,"+no+")");
d.appendChild(c);
var img=document.createElement("img");
img.setAttribute("id","previewImg"+no);
d.appendChild(img);
var b=document.createElement("br");
d.appendChild(b);
}
</script>
<style type="text/css">
img{
width:200px;
height:200px;
}
</style>
</head>
<body>
<div>
<form action="NewFileUpServlet" method="post" enctype="multipart/form-data">
<input type="file" name="fn" onchange="preview(this,1)" /><img id="previewImg1"/>
<br/>
<div id="dv_files">
</div>
<input type="button" value="继续添加" onclick="addFile('dv_files')"/><br/>
<input type="submit" value="上传"/>
</form>
</div>
</body>
</html>
我这个页面使用的是HTML5,支持图片的预览功能,还可以上传多张图片。
2、Servlet通过 @MultipartConfig实现文件上传
然后看下我的Servlet,通过使用@MultipartConfig来完成文件的上传
/**
* Servlet implementation class NewFileUpServlet Servlet3.0之后可以使用注解实现文件的上传
*/
@WebServlet("/NewFileUpServlet")
@MultipartConfig
public class NewFileUpServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public NewFileUpServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取request的所有的请求参数(将请求参数转换为Part)
Collection<Part> list = request.getParts();
for (Part p : list) {
// 获取上传的文件名称
String filename = p.getSubmittedFileName();
// 创建要保存的文件对象
File file = new File(createDir(getServletContext()), createName(filename));
// 保存文件
p.write(file.getAbsolutePath());
}
}
// 创建目录---以日期,一天一个文件夹
private File createDir(ServletContext context) {
String p1 = context.getRealPath("/files");
File file = new File(p1, new SimpleDateFormat("yyyy-MM-dd").format(Calendar.getInstance().getTime()));
if (!file.exists()) {
file.mkdirs();
}
return file;
}
// 创建文件名--区分同名文件,在文件名前加上当前的时间
private String createName(String name) {
return new SimpleDateFormat("yyyyMMddHHmmssSSS").format(Calendar.getInstance().getTime()) + "_" + name;
}
}
为了防止文件名相同我在接受的文件名前面加上当前时间,这个时间精确到毫秒。也为了日后文件会越来越多,我就每天创建一个文件夹用来记录每天的上传的文件。以上就是使用Servlet3.0的注解来完成的文件上传,不需要任何的jar包支持,而且还非常的方便。
这是需要JDK1.8、Dynamic Web Module 3.0才可以使用。如果版本较低那么只能使用下面的Apache的jar包,也是现在SpringMVC中支持的文件上传。
3、Apache的文件上传
/**
* Servlet implementation class FileUpServlet
* 实现文件的上传
*/
@WebServlet("/FileUpServlet")
public class FileUpServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public FileUpServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1、验证是否为文件上传
if(ServletFileUpload.isMultipartContent(request)){
//2、创建工厂类
DiskFileItemFactory factory=new DiskFileItemFactory();
//3、设置临时文件目录
factory.setRepository(new File("F:/Case/fileUptemp"));
//4、创建文件上传类对象
ServletFileUpload sfu=new ServletFileUpload(factory);
//5、设置大小
sfu.setFileSizeMax(10*1024*1024);//设置单个文件大小不超过10M
sfu.setSizeMax(100*1024*1024);//设置上传的总大小不超过100M
try {
//6、获取请求参数的所有参数信息
List<FileItem> list = sfu.parseRequest(request);
//7、遍历集合,将file标签的内容保存
for(FileItem fi:list){
if(!fi.isFormField())//验证是否是file标签
{
//创建要保存图片的File对象
File file=new File(createDir(getServletContext()),createName(fi.getName()));
//输出图片的绝对路径
System.out.println(file.getAbsolutePath());
//将上传的图片写出到指定路径
fi.write(file);
}
}
}catch (Exception e) {
e.printStackTrace();
}
}
}
//创建目录---以日期,一天一个文件夹
private File createDir(ServletContext context) {
String p1=context.getRealPath("/files");
File file=new File(p1,new SimpleDateFormat("yyyy-MM-dd").format(Calendar.getInstance().getTime()));
if(!file.exists()){
file.mkdirs();
}
return file;
}
//创建文件名--区分同名文件,在文件名前加上当前的时间
private String createName(String name) {
return new SimpleDateFormat("yyyyMMddHHmmssSSS").format(Calendar.getInstance().getTime())+"_"+name;
}
}
这里需要jar的支持,Apache文件上传jar包
在学习中有任何问题都欢迎留言交流。