文件上传:
* 要求:
1.表单的提交方式必须是POST
2.表单中必须有<input type="file" name="upload"/>标签,而且该标签必须有name属性.
3.表单的enctype属性的值,必须为:"multipart/form-data",表单所提交的Servlet上有@MultipartConfig注解表示: 该Servlet处理的是multipart/form-data类型的请求
index.jsp(web界面)
<%@ 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>Insert title here</title>
</head>
<body>
<h1>文件上传的页面</h1>
<!--
* 表单的提交的方式必须是POST.
* 表单中需要有文件上传的表单元素:这个元素这个元素必须有name属性和值:<input type=”file” name=”upload”>
* 表单的enctype属性的值必须是multipart/form-data.
-->
<form action="${ pageContext.request.contextPath }/UploadServlet" method="post" enctype="multipart/form-data">
<table border="1" width="600">
<tr>
<td>文件描述</td>
<td><input type="text" name="desc"></td>
</tr>
<tr>
<td>文件上传</td>
<td><input type="file" name="upload"></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="上传"></td>
</tr>
</table>
</form>
</body>
</html>
UUIDUtils.java
package com.upload.demo;
import java.util.UUID;
/**
* 生成随机字符串工具类(通用唯一识别码)
*
* @author 侯青华
*
*/
public class UUIDUtils {
// 私有构造
private UUIDUtils() {
}
// 返回一个识别码
public static String getUUID() {
return UUID.randomUUID().toString().replace("-", ""); // 去掉字符串的"-"
}
// 返回一个识别码+"_"+文件名的新文件名(防止上传文件名重复问题) 例:dasda_aaa.txt
public static String getUUIDFileName(String fileName) {
return getUUID() + "_" + fileName;
}
}
UploadUtils.java
package com.upload.demo;
/**
* 获得文件存储目录(根据hashCode计算+位运算生成二级目录)
*
* @author 侯青华
*
*/
public class UploadUtils {
public static String getPath(String uuidFileName) {
// 使用UUIDUtils生成的唯一文件名.hashCode();
int code1 = uuidFileName.hashCode();
int d1 = code1 & 0xf; // 获得到1级目录.
int code2 = code1 >>> 4;
int d2 = code2 & 0xf; // 获得到2级目录.
return "/" + d1 + "/" + d2; //返回获得的目录
}
}
UploadServlet.java(文件上传的Servlet)
package com.upload.demo;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
/**
* 上传文件Servlet
*
* @author 侯青华
* @version 创建时间:2018年3月22日 下午7:40:10
*/
@WebServlet("/UploadServlet") // 设置访问这个Servlet的路径
@MultipartConfig // 说明该Servlet处理的是multipart/form-data类型的请求
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@SuppressWarnings("resource")
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 接收普通数据(解决post方式request中文乱码)
request.setCharacterEncoding("utf-8");
// 解决文件输出中文乱码
response.setContentType("text/html;charset=utf-8");
// 接收文件
Part part = request.getPart("upload");
// 获得文件名
String header = part.getHeader("Content-Disposition");
int indx = header.lastIndexOf("filename=\"");
String fileName = header.substring(indx + 10, header.length() - 1);
// 获得文件输入流(拿到文件)
InputStream is = part.getInputStream();
// 获得upload文件路径
String path = this.getServletContext().getRealPath("/upload");
// 调用UUIDUtils获得唯一文件名
String uuidFileName = UUIDUtils.getUUIDFileName(fileName);
// 调用UploadUtils获得路径(对文件进行分目录存放,防止一个目录中文件过多)
String realPath = UploadUtils.getPath(uuidFileName);
File file = new File(path + realPath);
if (!file.exists()) {
// 路径不存在则创建
file.mkdirs();
}
// 输出流
FileOutputStream fos = new FileOutputStream(path + realPath + "/" + uuidFileName);
byte[] chs = new byte[1024];
int len;
while ((len = is.read(chs)) != -1) {
fos.write(chs, 0, len);
}
// 释放资源
is.close();
fos.close();
response.getWriter().println("文件上传成功!");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
总结: 文件名可以通过获取当前系统时间毫秒值+文件名的方式. 目录名也可以创建时间目录(依据天/周/月均可).依照不同情况进行编码.