首先先写一个工具类——uploadutils
package login_pack.utils;
import java.util.UUID;
/*
文件上传的工具类
* */
public class uploadutils {
/*
UUID 生成随机的字符串
生成唯一的文件名:
* */
public static String getUUIDFileName(String filename){
//由于UUID随机生成字符串,可能有我们不需要的字符例如"-"等
//将文件名的前面部分进行截取:xx.jpg ----> .jpg
int idx = filename.lastIndexOf(".");//获取" . "的位置
String extention = filename.substring(idx);//得到文件的扩展名
String uuidfilename = UUID.randomUUID().toString().replace("-","") + extention;//将随机的字符串中的" - " 替换为 ""空,就是去掉" - "
return uuidfilename;
}
}
然后开始写文件读写
//通过工具类获得唯一的文件名 utils 里面的 uploadutils 类
String uuidFileName = uploadutils.getUUIDFileName(filename);
//获得文件上传的数据
InputStream is = fileItem.getInputStream();
//获得文件上传的路径
String path = this.getServletContext().getRealPath("/upload");
//将输入流对接到输出流
String url = path + "\\" + uuidFileName;
OutputStream os = new FileOutputStream(url);
int len = 0;
byte[] b = new byte[1024];
while ((len = is.read(b)) != -1)
{
os.write(b, 0, len);
}
is.close();
os.close();
写一个uploadutils类是为了防止存储路径有文件的文件名相同,导致文件写入失败。然后通过io流写入写出文件。
用处:
做网站搭建的时候,可以通过这种方式去存储用户上传的头像到本服务器上。
例子:
regist.jsp文件
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>注册</title>
<link rel="stylesheet" href="./css/reg.css">
</head>
<body>
<div class="reg">
<div class="header">
<h1>
<a href="./login.jsp">登录</a> <a href="./regist.jsp">注册</a>
</h1>
</div>
<!--
文件上传到条件:
1. 表单必须是post提交方式
2. 表单中必须由问价你上传项,问价上传必须由name属性和值。文件上传项就是type = “file”
3. 表单拿到enctype属性必须设置为multipart/form-data
-->
<%
String path = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getServletContext().getContextPath();
//动态的获取 协议名“http”或者其他 , 获取 ip地址 , 获取端口号 , 获取工程名
%>
<form action="<%= path%>//registsevlet" method="post" enctype="multipart/form-data">
<table>
<tr>
<td class="td1">用户名</td>
<td><input type="text" class="input1" name="username"></td>
</tr>
<tr>
<td class="td1">密码</td>
<td><input type="password" class="input1" name="password"></td>
</tr>
<tr>
<td class="td1">昵称</td>
<td><input type="text" class="input1" name="nickname"></td>
</tr>
<tr>
<td class="td1">性别</td>
<td>
<input type="radio" name="sex" value="male">男
<input type="radio" name="sex" value="female">女
</td>
</tr>
<tr>
<td class="td1">上传头像</td>
<td><input type="file" id="photo" name="upload"></td>
</tr>
<tr>
<td class="td1">兴趣爱好</td>
<td><label>
<input type="checkbox" name="hobby" value="篮球">篮球
<input type="checkbox" name="hobby" value="足球">足球
<input type="checkbox" name="hobby" value="排球">排球
<input type="checkbox" name="hobby" value="羽毛球">羽毛球
</label></td>
</tr>
<tr>
<td colspan="2">
<div class="btn-red">
<input type="submit" value="注册" id="reg-btn">
</div>
</td>
</tr>
</table>
</form>
</div>
</body>
</html>
registservlet.java文件
package login_pack.servlet;
import org.apache.catalina.User;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
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 java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import login_pack.user;
import login_pack.utils.uploadutils;
@WebServlet(name = "registsevlet")
public class registsevlet extends HttpServlet {
//完成用户注册的servlet
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//数据的接收
//文件上传的基本操作:
try {
// 获得servletcontext对象:
List<user> uselist = (List<user>) this.getServletContext().getAttribute("list");//在initservlet中,servletcontext中设置了一个list集合 ps.这里要强制类型转换一下
// 定义一个map集合,用于保存接收到的 name passward
Map<String,String> map = new HashMap<String, String>();
// 1. 创建一个磁盘文件项工程对象
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
// 2. 创捷一个核心类
ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
// 3. 解析request请求,返回的是list集合,存的是fileitem对象
List<FileItem> list = servletFileUpload.parseRequest(request);
//定义一个list集合,用于保存兴趣爱好数据
List<String> hobbyList = new ArrayList<String>();
// 4.遍历集合,获得每个fileitem,判断是表单项还是文件上传项
String url = "";
for (FileItem fileItem : list)
{
if (fileItem.isFormField())
{//普通表单项
//接收表单项参数的值
String name = fileItem.getFieldName();//获得表单项的name值
String value = fileItem.getString("UTF-8");
if("hobby".equals(name)) {//判断是否是复选表单项
String hobbyValue = fileItem.getString("UTF-8");
//接收到一个值,就这个值存到hobbyList中
hobbyList.add(hobbyValue);
hobbyValue = hobbyList.toString().substring(1, hobbyList.toString().length() - 1);
//讲爱好数据存入到mao集合中
map.put(name, hobbyValue);
}else {
//如果不用map集合存储对应的name,password 的值,第二次循环就会覆盖上一次循环的值,就从name 变成了 password
//将数据存到map集合中
map.put(name, value);
}
}else {
//文件上传项:
//文件上传功能
//获得文件上传的名称:
String filename = fileItem.getName();
if (filename != null && !filename.equals(""))
{
//通过工具类获得唯一的文件名 utils 里面的 uploadutils 类
String uuidFileName = uploadutils.getUUIDFileName(filename);
//获得文件上传的数据
InputStream is = fileItem.getInputStream();
//获得文件上传的路径
String path = this.getServletContext().getRealPath("/upload");
//将输入流对接到输出流
url = path + "\\" + uuidFileName;
OutputStream os = new FileOutputStream(url);
int len = 0;
byte[] b = new byte[1024];
while ((len = is.read(b)) != -1)
{
os.write(b, 0, len);
}
is.close();
os.close();
}
else {
request.setAttribute("nopicture", "请存入头像");
request.getRequestDispatcher("/regist.jsp").forward(request, response);
return;
}
}
}
//校验用户名,如有重复则不允许添加
for(user u:uselist){
if (u.getUsername().equals(map.get("username"))){
request.setAttribute("msg", "用户名已存在");
request.getRequestDispatcher("/regist.jsp").forward(request, response);
return ;
}
}
//注册到的信息存储到 user中
user use = new user();
use.setUsername(map.get("username"));
use.setPassword(map.get("password"));
use.setNickname(map.get("nickname"));
use.setSex(map.get("sex"));
use.setHobby(map.get("hobby"));
use.setPath(url);
//将注册用于的信息存入list集合中,initservlet中有一个user,list
uselist.add(use);
this.getServletContext().setAttribute("list", uselist);//更新context中list的值
//存一个用于名
request.getSessi().setAttribute("username", use.getUsername());
//注册成功,跳转到登陆页面:
response.sendRedirect(request.getContextPath() + "/login.jsp");
}catch (FileUploadException e){
e.printStackTrace();
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}