文件上传
主要步骤
1.首先在上传jsp页面表单头里写上enctype="multipart/form-data"
2.然后在处理的servlet里创建一个DiskFileItemFactory工厂
3.创建一个文件上传解析器
4.解析请求对象。parseRequest()方法,得到上传数据的集合
5.遍历集合,判断上传的是否是文件
6.上传文件的文件名处理
7.write()方法写入服务器目录
上传页面的jsp代码
<body>
<form action="${pageContext.request.contextPath}/UploadServlet" enctype="multipart/form-data" method="post">
上传用户:<input type="text" name="username"><br/>
上传文件1:<input type="file" name="file1"><br/>
上传文件2:<input type="file" name="file2"><br/>
<input type="submit" value="提交">
</form>
<a href="InitDownloadServlet">下载</a>
</body>
处理上传的servlet代码
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 1.得到上传文件的保存目录,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全
String savePath = this.getServletContext()
.getRealPath("WEB-INF/upload");
File file = new File(savePath);
// 判断上传文件的保存目录是否存在
if (!file.exists()) {
System.out.println(savePath + "目录不存在,需要创建");
file.mkdir();
}
// 2、创建一个DiskFileItemFactory工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(1024 * 1024 * 3000); // 设置仓库的大小
// 3、创建一个文件上传解析器
ServletFileUpload upload = new ServletFileUpload(factory);
// 这里是写了一个进程监控。
upload.setProgressListener(new ProgressListener() {
@Override
public void update(long arg0, long arg1, int arg2) {
System.out.println("文件大小为:" + arg1 + ",当前已处理:" + arg0);
}
});
// 解决上传文件名的中文乱码
upload.setHeaderEncoding("utf-8");
// 判断提交上来的数据是否是上传表单的数据
if (!ServletFileUpload.isMultipartContent(request)) {
// 按照传统方式获取数据
return;
}
// 4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,
// 每一个FileItem对应一个Form表单的输入项
List<FileItem> list = null;
try {
list = upload.parseRequest(request);
} catch (FileUploadException e) {
e.printStackTrace();
}
if (list != null && list.size() > 0) {
// 5.遍历上传所有的表单数据
for (FileItem item : list) {
// 如果fileitem中封装的是普通输入项的数据
if (item.isFormField()) {
String name = item.getFieldName();
System.out.println(name);
} else {
// 如果fileitem中封装的是上传文件
// 得到上传的文件名称
String filename = item.getName();
if (filename == null || "".equals(filename.trim())) {
continue;
}
// 6.由于浏览器的不同,获取的文件名的前缀可能不一致,所以需要处理
filename = filename
.substring(filename.lastIndexOf("\\") + 1);
//获取文件名称不包含后缀
String name = filename.substring(0,
filename.lastIndexOf("."));
// 截取文件扩展名
String extension = filename.substring(filename
.lastIndexOf("."));
// 重新构建文件名称 每次上传会在名字后面加上时间,解决了重复上传覆盖。
filename = name + new Date().getTime() + extension;
File savaFile = new File(file, filename);
try {
// 7.写入
item.write(savaFile);
} catch (Exception e) {
e.printStackTrace();
}
item.delete();
System.out.println(filename + " 文件上传成功");
}
}
}
}
文件的下载
文件下载比较简单,主要步骤如下:
1. 设置文件ContentType类型
2. 设置文件头
3. 得到要下载的文件,并放入输入流中
4. 通过响应对象获得输出流
5. 边读取边写入
初始化获得服务器端文件的servlet代码
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 获取服务器端下载的文件的路径
String savePath = this.getServletContext()
.getRealPath("WEB-INF/upload");
// 通过服务器路径创建目录对象
File downloadDir = new File(savePath);
// 获取目录下面所有文件
File[] files = downloadDir.listFiles();
// 把文件数组对象保存到request对象中
request.setAttribute("files", files);
request.getRequestDispatcher("download.jsp").forward(request, response);
}
处理下载的servlet代码
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
String fileName = request.getParameter("fileName");
fileName = new String(fileName.getBytes("iso-8859-1"), "UTF-8");
String savePath = this.getServletContext().getRealPath(
"/WEB-INF/upload");
// 1.设置文件ContentType类型,这样设置,会自动判断下载文件类型
response.setContentType("multipart/form-data");
// 2.设置文件头:最后一个参数是设置下载文件名
response.setHeader("Content-Disposition", "attachment;filename="
+ URLEncoder.encode(fileName, "UTF-8"));
File saveFile = new File(savePath, "/" + fileName);
InputStream in = new FileInputStream(saveFile);
OutputStream out = response.getOutputStream();
byte[] bytes = new byte[512];
int len = 0;
while ((len = in.read(bytes)) != -1) {
out.write(bytes, 0, len);
}
in.close();
out.close();
}
注:上面没有设置下载后文件的存放目录,默认的浏览器的下载目录,大部分浏览器都可以自行选择下载目录。当然自己也可以自己重写一个输出流,把文件写进去。
学习笔记,如有不足之处,还望指正。