1.文件上传的三要素
action="UploadServlet" method="post" enctype="multipart/form-data"
页面代码:
<form action="UploadServlet" method="post" enctype="multipart/form-data">
<div align="20px">
<div class="form-group">
<label for="exampleInputPassword1">name</label>
<input type="username" class="form-control" id="exampleInputPassword1" name="name">
</div>
<div class="form-group">
<label for="exampleInputFile">File input</label>
<input type="file" id="exampleInputFile" name="file">
</div>
<button type="submit" class="btn btn-default">提交</button>
</div>
</form>
所需要的jar
代码:
Util类
/**
* 文件上传的工具类,里面定义一些工具方法
*/
public class FileServletUtil {
/**
* 在给定的文件名前添加唯一的标识,让文件名在整个上传服务器中保持唯一
* @param filename
* @return
*/
public static String makeFile(String filename){
String s = UUID.randomUUID().toString()+"_"+System.currentTimeMillis()+"_"+filename;
return s;
}
/**
* 为方式一个目录下有太多的文件,使用hash算法来打乱存储
* @param filename
* @param savePath
* @return
*/
public static String makeFilePath(String filename, String savePath){
// 得到文件名的hashCode值,得到的就是filename这个字符串对象在内存中的地址
int hashCode = filename.hashCode();
int dir1 = hashCode & 0xf;
int dir2 = (hashCode & 0xf0) >> 4;
String dir = savePath + File.separator + dir1 + File.separator + dir2;
File file = new File(dir);
if (!file.exists()){
file.mkdirs();
}
return dir;
}
上传代码
业务需求:
为保证服务器安全,上传文件应该放在外界无法直接访问的目录下,比如放于 WEB-INF目录下。
为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名
为防止一个目录下面出现太多文件,要使用hash算法打散存储
要限制上传文件的最大值
要限制上传文件的类型,在收到上传文件名时,判断后缀名是否合法
@WebServlet(name = "UploadServlet",urlPatterns = "/UploadServlet")
public class UploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 得到上传文件的保存目录, 将上传的文件放置于WEB-INF目录下, 可以防止外界直接访问该资源,保证程序的安全
String savePath = getServletContext().getRealPath("WEB-INF" + File.separator + "upload");
// 上传是生成的临时文件存放的目录
String tempPath = getServletContext().getRealPath("WEB-INF" + File.separator + "temp");
File temFile = new File(tempPath);
if (!temFile.exists()){
temFile.mkdir();
}
//1,创建DiskFileItemFactory工厂类
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
// 设置工厂的缓冲区大小,当上传的文件大小超过缓冲区的大小时,就会产生一个临时文件存放到指定的临时目录中
diskFileItemFactory.setSizeThreshold(1024*100);
// 设置上传是生成的临时文件的保存目录
diskFileItemFactory.setRepository(temFile);
// 2. 创建一个上传解析器
ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
// 解决上传文件中的中文乱码问题
servletFileUpload.setHeaderEncoding("UTF-8");
// 3. 判断提交上的数据是否是上传表单的数据
if (!ServletFileUpload.isMultipartContent(request)){
return;
}
// 设置文件的大小的最大值,50m
servletFileUpload.setFileSizeMax(1024*1024*50);
// 设置多个上传文件的总大小,最大值=同时上传的多个文件的最大值的和,100m
servletFileUpload.setSizeMax(1024*1024*100);
List<FileItem> itemList = null;
// 4. 使用ServletFileUpload解析器上传数据,解析结果是一个List<FileItem>的集合,每一个FileItem对应一个Form表单的输入项
try {
itemList = servletFileUpload.parseRequest(request);
for (FileItem fileItem : itemList) {
if (fileItem.isFormField()){
String fieldName = fileItem.getFieldName();
// 解决用户输入时数据的中文乱码
String value = fileItem.getString("UTF-8");
System.out.println(fieldName+"-----"+value);
}else{
// 如果FileItem中封装的是文件file域
String fileName = fileItem.getName();
if(fileName == null || "".equals(fileName.trim())){
continue;
}
fileName = fileName.substring(fileName.lastIndexOf(File.separator) + 1);
String filesufixName = fileName.substring(fileName.lastIndexOf(".") + 1);
System.out.println("上传文件的扩展名为:" + filesufixName);
// 获取item中上传文件的输入流
InputStream in = fileItem.getInputStream();
// 得到文件的保存名称
String saveFileName = FileServletUtil.makeFile(fileName);
// 得到文件保存目录
String saveRealPath = FileServletUtil.makeFilePath(saveFileName, savePath);
System.out.println("save real path " + saveRealPath);
FileOutputStream out = new FileOutputStream(saveRealPath + File.separator + saveFileName);
byte[] buffer = new byte[1024];
int len ;
while((len = in.read(buffer)) != -1){
out.write(buffer, 0, len);
}
in.close();
out.close();
System.out.println("upload success.");
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
data
Input type=file