JAVA-WEB基础

文件上传(妈妈不用再担心了)

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>
注意 :
  1. 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

这样 , 文件上传也就搞定啦!

上一篇下一篇

猜你喜欢

热点阅读