javaweb servlet3 上传文件

介绍

上传文件是最常用的功能之一,如网购评论时要发图片,报考网站要上传个人信息等

实现html

创建 upload.jsp,关键内容如下:

<form method="post" enctype="multipart/form-data" action="upload">
    上传图片:<input type="file" name="img"><br>
    描述:<input type="text" name="descrip"><br>
    <input type="submit">
</form>

关键:

  • method="post" 必须是 post 方法

  • enctype="multipart/form-data":enctype 是表单请求正文的类型,上传文件必须设置,表示以 的方式将数据发送给服务器

  • <input type="file" name="img">:上传文件控件,注意名字

相关类和方法

获取 Part 接口对象:req.getPart("img")

Part 接口,通过该接口获取上传文件相关信息

获取上传文件名:head.getSubmittedFileName()

获取文件大小:head.getSize()

写入到指定位置:head.write()

实现Servlet

有缺点:不能上传同名文件

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {


    Part head = req.getPart("img");
    if(head!=null) {
        // 上传文件才执行下面代码
        if(head.getSubmittedFileName()!=null && !"".equals(head.getSubmittedFileName())) {
            // 在当前工程下创建upload文件夹
            // upload文件夹的绝对路径(全路径)
            String upload = req.getServletContext().getRealPath("/upload");
            File uploadFile = new File(upload);
            if (!uploadFile.exists()) {
                // 创建文件夹
                uploadFile.mkdirs();
            }

            String uuid = UUID.randomUUID().toString().replace("-", "");
            //截取文件后缀

            // 拼装,uuid+文件后缀

            // 拼装的是保存上传文件的全路径
            File file = new File(uploadFile, head.getSubmittedFileName());
            // 保存
            head.write(file.getAbsolutePath());

            //文件名称
            System.out.println(head.getSubmittedFileName());
            //文件大小
            System.out.println(head.getSize());
        }
    }

    // 通过request对象获取浏览器提交的参数
    String username = req.getParameter("descrip");
}

web.xml 配置

<servlet>
    <servlet-name>RegistServlet</servlet-name>
    <servlet-class>com.boda.servlet.RegistServlet</servlet-class>
    <!-- 必须加此配置,否则不生效 -->
    <multipart-config>

    </multipart-config>
</servlet>
<servlet-mapping>
    <servlet-name>RegistServlet</servlet-name>
    <url-pattern>/reg</url-pattern>
</servlet-mapping>

其他配置

<multipart-config> 标签中还可以配置下面内容:

<file-size-threshold></file-size-threshold> 接收数据大于该值时,将缓存数据写入到文件中
<location></location> 保存位置
<max-file-size></max-file-size> 允许上传文件的最大大小,默认为-1,无限制,单位:byte
<max-request-size></max-request-size> 请求的最大数量,默认为-1,无限制,单位:byte

原文出处:https://malaoshi.top/show_1IX6DgJisHPL.html