文件上传(妈妈不用再担心了)
2020-05-19 本文已影响0人
superNeil
文件上传
1.文件上传
概念 : 将本地磁盘中的文件 放到 服务器磁盘中 . ( 本地--服务器 )
image-20200519071103563.png
1.Servlet 获取到数据怎么做?
答: 1. 接收请求数据 : 用户名(普通文本) ; 文件(二进制) --** 需要把二进制数据以文件方式保存到磁盘中,再把磁盘路径保存到数据库中 .
1.1 准备 (register.jsp , 写表单)
<body>
${msg} <!--这里可以先不写 , 后面再写 , 这是为后面给用户提示用的哈-->
<h3 style="color: crimson">文件上传模拟</h3>
<form method="post" action="/register" enctype="multipart/form-data">
<p>用户名: <input type="text" name="username"></p>
<p>文件上传: <input type="file" name="headImg"></p>
<input type="submit" value="提交">
</form>
</body>
注意 :
- enctype(编码方式) enctype="multipart/form-data" 否则报下面这个错.
multipart/form-data是指表单数据有多部分构成,既有文本数据,又有文件等二进制数据的意思。
2.method 用 post . get会限制大小
3.需要file控件
1.2 Servlet3.0 文件上传 (十分简单 , 妈妈再也不用担心我学不会了)
首先 我们先看一样要用到的 API ,不然一会很懵了的 .
image-20200519074738052.png
image-20200519075743190.png
@WebServlet("/register")@MultipartConfig
public class UploadServlet extends HttpServlet {
//文件上传
//细节:
// 1.文件名覆盖问题--UUID来解决
// 2.文件保存位置问题 servletContext上下文对象来,获取真实路径realPath("/upload")
// 3.文件类型约束的问题
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置编码格式
req.setCharacterEncoding("utf-8");
//String username = req.getParameter("username");
//System.out.println("用户名--"+username);
//----------------------------------------
//用于获取请求中指定的name文件----------获取指定的文件 headImg
Part part = req.getPart("headImg");
//--------------------------指定文件类型----------------------------------------------------------------------
if(!part.getContentType().startsWith("image/")){
req.setAttribute("msg","亲,请上传图片哦!");
req.getRequestDispatcher("/register.jsp").forward(req,resp);
return;
}
//--------------------------------------------------------------------------------------------------
//获取文件名----------------------------getSubmittedFileName()
String FileName = part.getSubmittedFileName();
//System.out.println(FileName);//cookie.jpg
//--------------------------------------获取 拓展名
String substring = FileName.substring(FileName.lastIndexOf("."));//.jpg 拓展名 substring 截取
//--------------------------------------UUID + 拓展名 (唯一的字符串) 作为文件名,
String fileName=UUID.randomUUID()+substring;
//获取相对 web 根路径的绝对路径 (*****看看看*****)
String realPath = getServletContext().getRealPath("/upload");
part.write(realPath+"/"+fileName);//上传到 ----
}
记得: 需要给Servlet 贴注解 @MultipartConfig
注意 : @MultipartConfig主要用来指明servlet的请求当中包含文件,文件我们通过以下的方式获取:
Part part = req.getPart("filename");
注意: 无法获取项目下的("/upload")目录 :
原因是idea 工具使用打包web项目(war)的方式来部署,所以位置可能稍有偏差,需要还原web项目的原本目录结构,以及调整部署方式 .
image-20200519091226532.png image-20200519091305182.png image-20200519091413283.png这样 , 文件上传也就搞定啦!