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

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类是在一定的范围内(从特定的名字空间到全球)唯一的机器生成的标识符,对原理感兴趣的小伙伴可以单独去搜搜,这里不在赘述~

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
JavaWeb实现文件上传可以使用多种技术和框架。其中一种常用的方法是使用Servlet和Apache Commons FileUpload库。 首先,你需要在JSP页面中创建一个表单,设置表单的enctype属性为"multipart/form-data",这样才能支持文件上传。表单中需要包含一个或多个<input type="file">标签,用于选择要上传的文件。同时,你也可以添加其他的表单字段,如用户名等。\[2\] 接下来,在Servlet中处理文件上传。你可以使用Apache Commons FileUpload库中的ServletFileUpload来处理上传的文件数据。通过调用parseRequest(HttpServletRequest)方法,你可以将表单中的每个输入项封装成一个FileItem对象,并以List的形式返回。然后,你可以遍历这个List,获取每个FileItem对象的信息,如文件名、文件大小等。\[3\] 在处理文件上传时,你可以根据需要进行一些验证和处理操作,如检查文件型、文件大小限制等。然后,你可以将文件保存到服务器的指定位置,可以是本地文件系统或数据库等。 以下是一个简单的示例代码,演示了如何在JavaWeb实现文件上传: ```java @WebServlet("/upload") @MultipartConfig public class UploadServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 创建一个文件上传处理器 ServletFileUpload upload = new ServletFileUpload(); try { // 解析请求,获取文件项列表 List<FileItem> items = upload.parseRequest(request); // 遍历文件项列表 for (FileItem item : items) { // 判断当前项是否为文件 if (!item.isFormField()) { // 获取文件名 String fileName = item.getName(); // 保存文件到指定位置 item.write(new File("/path/to/save/" + fileName)); } } // 文件上传成功 response.getWriter().println("文件上传成功"); } catch (Exception e) { // 文件上传失败 response.getWriter().println("文件上传失败"); e.printStackTrace(); } } } ``` 在这个示例中,我们使用了@WebServlet注解将Servlet映射到"/upload"路径。通过@MultipartConfig注解,我们告诉Servlet容器该Servlet支持文件上传。 在doPost方法中,我们创建了一个ServletFileUpload对象,并调用parseRequest方法解析请求,获取文件项列表。然后,我们遍历文件项列表,判断每个项是否为文件,如果是文件,则获取文件名并保存到指定位置。 最后,我们根据文件上传的结果返回相应的信息给客户端。 请注意,这只是一个简单的示例,实际的文件上传过程可能需要更多的处理和验证操作,如文件大小限制、文件型检查等。你可以根据自己的需求进行相应的扩展和优化。 希望这个示例能帮助你理解如何在JavaWeb实现文件上传。如果你有任何进一步的问题,请随时提问。 #### 引用[.reference_title] - *1* [【JavaWeb】文件的上传](https://blog.csdn.net/wang_qiu_hao/article/details/127177250)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [JavaWeb--文件的上传](https://blog.csdn.net/zhoulv163/article/details/126006904)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值