一.引导
在java web开发中,文件的上传和下载是非常常用的功能,本文将介绍文件上传的具体实现.
二.文件上传的环境搭建
本文中所讲的上传实例需要的jar包:commons-io-2.5.jar , commons-fileupload-1.3.2.jar; 将这两个jar包导入项目中.
jar包下载地址: https://pan.baidu.com/s/1dEMdWGh 密码: vmvx
三.具体代码的实现
本文中的实例既包括上传界面以及核心servlet.先介绍核心servlet吧.
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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.FileUploadException;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
@WebServlet(urlPatterns="/fileupload")
public class fileupload extends HttpServlet{
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//得到上传文件的保存路径,如果不存在,就建立该路径
String path = req.getServletContext().getRealPath("/WEB-INF/upload");
File f = new File(path);
if(f.exists()&&f.isDirectory()) {
} else {
//目录不存在,需要创建目录
System.out.println("目录不存在");
f.mkdirs();
}
//使用apache文件上传组件处理文件的顺序
try {
final long time = System.currentTimeMillis();
//一.创建一个DiskFileItemFactory工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(1024*100);//设置缓冲区的大小
File file = new File(req.getServletContext().getRealPath("/WEB-INF/temp"));
if(!file.exists()||!file.isDirectory()) {
file.mkdirs();
}
factory.setRepository(file);//设置临时缓冲区
//二.创建文件上传解析器
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setProgressListener(new ProgressListener() {
@Override
public void update(long arg0, long arg1, int arg2) {
// TODO Auto-generated method stub
double progress = (double)arg0/arg1;
System.out.println("上传进度:"+progress);
long time2 = System.currentTimeMillis();
System.out.println("上传速度"+arg0/(time2-time)+"kb/s");
}
});
upload.setHeaderEncoding("utf-8");//解决文件上传的乱码问题
List<FileItem> list = upload.parseRequest(req);//解析请求头
for(FileItem item : list) {
//如果封装的是一个普通的参数信息
if(item.isFormField()) {
String name = item.getFieldName();
String value = item.getString("utf-8");
System.out.println(name+":"+value);
} else {
String name = item.getName();
if(name == null) {
throw new RuntimeException("文件夹不能为空");
}
//ie浏览器是个奇葩,name带有路径,获取名称时需要解析
if(name.contains("\\")) {
name = name.substring(name.lastIndexOf("\\")+1);
}
//获取文件内容的输入流
InputStream in = item.getInputStream();
name = UUID.randomUUID()+"_"+name;
FileOutputStream out = new FileOutputStream(path+"/"+name);
//将文件上传到指定的位置
int i = 0;
while((i=in.read())!=-1) {
out.write(i);
}
System.out.println("上传成功"+path);
in.close();
out.close();
item.delete();//会将临时文件删掉
}
}
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
介绍完核心servlet,该实例提供一个简单的jsp界面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>file upload!!!</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/fileupload" method="post" enctype="multipart/form-data">
<table id="tb">
<tr>
<td>文件信息<input type='text' name='info' /></td>
<td>上传文件<input type='file' name='upload' /></td>
</tr>
</table>
</form>
</body>
<html>