JavaWeb文件上传的实现及ServletFileUpload类的使用

JavaWeb文件上传的实现及ServletFileUpload类的使用1、文件上传代码所依赖的jar包:<!https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifact

大家好,欢迎来到IT知识分享网。

1、文件上传代码所依赖的jar包:

<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.4</version>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.11.0</version>
        </dependency>
 <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.2.1</version>
            <scope>provided</scope>
        </dependency>

2、在JSP中编写表单代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
<%--   千万不能忘记   enctype="multipart/form-data"  --%>

  <form action="${pageContext.request.contextPath}/uploadFile.do" method="post" enctype="multipart/form-data" >
    <input type="text" name="name" value="姓名"> <br>
    <input type="file" name="file1"><br>
    <input type="file" name="file2"><br>
    <input type="text" name="address" value="住址"><br>
    <input type="submit">|<input type="reset">
    
  </form>

  </body>
</html>

3、创建对应的servlet类 用于处理请求 , 并在web.xml中注册servlet

<servlet>
        <servlet-name>UploasFile</servlet-name>
        <servlet-class>com.pqw.servlet.UploadFile</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>UploasFile</servlet-name>
        <url-pattern>/uploadFile.do</url-pattern>
    </servlet-mapping>

4、编写servlet类代码

4.1、创建上传文件保存在网站的路径

// 处理编码问题
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
// 创建文件上传路径
        String realPath = this.getServletContext().getRealPath("WEB-INF/upload");
        System.out.println("realPath"+realPath);
        File uploadFile = new File(realPath);
// 路径不存在 则创建文件夹
        if (!uploadFile.exists()){ 
   
            uploadFile.mkdir();
        }

4.2、创建大文件临时保存路径

// 创建文件临时存放路径
        String tempPath = this.getServletContext().getRealPath("WEB-INF/temp");
        File tempFile = new File(tempPath);
        if (!tempFile.exists()){ 
   
            tempFile.mkdir();
        }

4.3、创建DiskFileItemFactory对象

// 创建DiskFileItemFactory对象
        DiskFileItemFactory factory = new DiskFileItemFactory();

4.4、 创建ServletFileUpload对象

// 创建ServletFileUpload对象
        ServletFileUpload servletFileUpload = new ServletFileUpload(factory);

4.5、将前端的请求解析为FileItem对象,并处理每个Item对象

// 将前端的请求解析为FileItem对象
        List<FileItem> fileItems=null;
        try { 
   
            fileItems = servletFileUpload.parseRequest(req);
        } catch (FileUploadException e) { 
   
            e.printStackTrace();
        }
// 处理前端发送过来每个表单控件被封装成FileItem对象
        for (FileItem fileItem : fileItems) { 
   
// 判断表单控件是文件表单还是普通表单
            if (fileItem.isFormField()){ 
   
// 获取普通表单控件的值
                String name = fileItem.getFieldName();
                String value = fileItem.getString("UTF-8");
                System.out.println(name+" : "+value);
            }else { 
   
// 处理上传的文件
                String uploadFileName = fileItem.getName();
                System.out.println("uploadFileName: "+uploadFileName);
                if (uploadFileName.trim().equals("") ||uploadFileName==null){ 
   
                    continue;
                }
// 获取文件名
                String fileName = uploadFileName.substring(uploadFileName.lastIndexOf("/" )+ 1);
// 使用UUID 保证文件名唯一性 避免文件被覆盖
                UUID uuid = UUID.randomUUID();
// 为每个上传的文件创建一个单独的uuid文件夹
                String uploadPath = realPath+"/"+uuid;
                File uuidFilePath = new File(uploadPath);
                if (!uuidFilePath.exists()){ 
   
                    uuidFilePath.mkdir();
                }
// 获取文件输入流
                InputStream inputStream = fileItem.getInputStream();

// 创建文件输出流
                FileOutputStream outputStream = new FileOutputStream(uploadPath+"/"+fileName);
                byte[] buffer = new byte[1024 * 1024];
                int length=0;
// 将流写入文件
                while ((length=inputStream.read(buffer))>0){ 
   
                    outputStream.write(buffer,0,length);
                }
// 关闭资源
                outputStream.close();
                outputStream.close();
                req.setAttribute("message","文件上传成功!");

            }

        }

*到这里文件上传功能是可以实现了~~~~*
上传的文件目录实在项目打的包文件夹下
在这里插入图片描述

5、关于文件上传的几个注意点:

5.1、上传的文件中我们一般放在外界无法直接访问的目录下(例如WEB-INF目录),保证网站的安全性;

5.2、要考虑用户上传文件重名问题,需要给每个文件形成一个唯一的文件名。常用方法有UUID、MD5、文件名末尾添加时间戳、位运算算法等…

5.3、要限制上传文件的最大值,避免恶意用户恶意占用磁盘资源;

5.4、要限制可上传文件类型,并检验后缀名的合法性.

对于文件重名问题,我使用的方法是:使用UUID类为每个文件创建一个唯一命名的的文件夹,将文件放在改目录下。
在这里插入图片描述
UUID类是在一定的范围内(从特定的名字空间到全球)唯一的机器生成的标识符,对原理感兴趣的小伙伴可以单独去搜搜,这里不在赘述~

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/21796.html

(0)
上一篇 2024-01-15 09:33
下一篇 2024-01-15 14:33

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信