原文借鉴:https://www.cnblogs.com/xdp-gacl/p/4200090.html,推荐关注
upImage.jsp中
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath();
%>
<%--解决相对路径出现错误问题,所以改为绝对路径--%>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--定义绝对路径,basePath --%>
<form action="<%=basePath%>/UpImageServlet" method="post" enctype="multipart/form-data" id="image">
用户名:<input name="name" type="text"/>
密码:<input name="password" type="password"/>
<input name="image" type="file"/>
<input value="提交" type="submit"/>
</form>
<%--<button onclick="toolTiJ()">提交</button>如果用button写会出现文件不存在的问题--%>
</body>
</html>
<%--button和input的区别
1、<input type="button" /> 这就是一个按钮。如果你不写javascript 的话,按下去什么也不会发生。
2、<input type="submit" /> 这样的按钮用户点击之后会自动提交 form,除非你写了javascript 阻止它。
3、<button>
这个按钮放在 form
中也会点击自动提交,比前两个的优点是按钮的内容不光可以有文字,还可以有图片等多媒体内容。(当然,前两个用图片背景也可以做到)。它的缺点是不同的浏览器得到的
value 值不同;可能还有其他的浏览器兼容问题。
4、其他标签,例如 a, img, span, div,然后用图片把它伪装成一个按钮--%>
UpImageServlet中
public class UpImageServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
//确认目录是否存在 无 创建
String fileDir = request.getServletContext().getRealPath("/upload");
File saveFile = new File(fileDir);//获取当前文件夹目录
if (!saveFile.isDirectory() && !saveFile.exists()) {
saveFile.mkdir();//不是文件夹 不存在 创建这个文件夹
}
//判断提交上来的数据是否是上传表单的数据 //按照传统方式获取数据
if (ServletFileUpload.isMultipartContent(request)) {
//使用Apache文件上传组件处理文件上传步骤:
//创建一个DiskFileItemFactory工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
//创建一个文件上传解析器
ServletFileUpload upload = new ServletFileUpload(factory);
//设置工厂的缓冲区的大小,当上传的文件大小超过缓冲区的大小时,就会生成一个临时文件存放到指定的临时目录当中。
factory.setSizeThreshold(1024*100);// 设置缓冲区的大小为100KB,如果不指定,那么缓冲区的大小默认是10KB
//设置上传单个文件的大小的最大值 1024*1024字节,也就是1MB 目前设置为40MB
upload.setFileSizeMax(1024 * 1024 * 40);//
//解决上传文件名的中文乱码 设置参数 设置文件编码
upload.setHeaderEncoding("utf-8");
// 4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项
List<FileItem> list = null;
try {
list = upload.parseRequest(request);
} catch (FileUploadException e) {
e.printStackTrace();
}
HashMap<String, Object> hashMap = new HashMap<>();
for (FileItem fileItem : list) {
if (fileItem.isFormField()) {// 如果fileitem中封装的是普通输入项的数据
String name = fileItem.getFieldName();
//解决普通输入项的数据的中文乱码问题
String value = fileItem.getString("utf-8");//得到了姓名的name和它的值
hashMap.put(name, value);//局部变量改为全局变量存入数据库中
} else {
//如果fileitem中封装的是上传文件//得到上传的文件名称,//得到图片元素
//处理相关的数据,把数据插入到数据后,先进行查重处理
String fileName = fileItem.getName();
if (fileName == null || fileName.trim().equals("")) {//trim方法去掉两端空格,判断fileName是否为空
continue;
}
//注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如: c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt
//处理获取到的上传文件的文件名的路径部分,只保留文件名部分
//不为空 构建 文件的名称 用时间戳命名;
Long t1 = System.currentTimeMillis();
//文件的后缀
String t2 = fileName.substring(fileName.indexOf("."));
System.out.print(t2);
fileName = Long.toString(t1) + t2;//得到文件名称
//1.读取数据,用输入流 获取fileItem中的上传文件的输入流
InputStream in = fileItem.getInputStream();
byte[] buffer = new byte[1024];//缓冲区,读取的数据暂存
//创建一个标识len,用来判断数据是否读取完成
int len = 0;
//创建一个文件输出流
FileOutputStream out = new FileOutputStream(fileDir + "//" + fileName);
//循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据
while ((len = in.read(buffer)) > 0) {
//使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(fileDir + "//" + fileName)当中
out.write(buffer, 0, len);
}
//关闭输入流
in.close();
//关闭输出流
out.close();
//删除处理文件上传时生成的临时文件
fileItem.delete();
//保存文件路径 相对或hhttp.....
hashMap.put("image", fileDir + "//" + fileName);
}
}
String name = (String) hashMap.get("name");
String pw = (String) hashMap.get("password");
String image = (String) hashMap.get("image");
String sql = "select * from tooll where username='" + name + "' ";
List<HashMap<String, Object>> list2 = new ArrayList<>();
list2 = ShuJuKu.getList(sql);
if (list.size() > 0) {
response.getWriter().print("用户名已存在");
}else{
String sql2 = "insert into tooll(name,pw,image) values('" + name + "','" + pw + "','" + image + "')";
int count;
count = ShuJuKu.update(sql2);
if (count > 0) {
response.getWriter().print("插入成功");
} else {
response.getWriter().print("插入失败");
}
}
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
各级结构如下: