JavaWeb-MAVEN项目实现文件上传

javaWeb文件上传

(1)在pom.xml配置文件中导入依赖

<!--servlet的依赖-->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
</dependency>
<!--JSP依赖-->
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/jsp-api -->
<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.2</version>
</dependency>
<!-- 文件上传用的包commons-io -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.7</version>
</dependency>
<!--文件上传用的包commons-fileupload -->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.4</version>
</dependency>

(2)下面是我的项目结构
在这里插入图片描述

(3)首页 index.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
	//enctype="multipart/form-data"  这个是必要的 
	//提交方式必须是post
	//${pageContext.request.contextPath}  当前项目的绝对路径 ,在自己电脑上运行没问题,但是如果你发布到了网上就会出问题,所以还是加上
	<form action="${pageContext.request.contextPath}/upload.do" enctype="multipart/form-data" method="post">
  	      上传用户:<input type="text" name="username"><br/>
          上传文件1<input type="file" name="file1"><br/>
          上传文件2<input type="file" name="file1"><br/>
                   <input type="submit" value="提交">
    </form>
</body>
</html>

(4) msg.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>消息提示</title>
</head>
<body>
	//获取UploadServlet.java传过来的信息
    ${msg}
</body>
</html>

(5)UploadServlet.java

package com.wu.servlet;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.UUID;

@WebServlet("/upload.do")
public class FileUploadServlet extends HttpServlet {

    private static final long serialVersionUID = 7525671995700987977L;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 判断上传的文件是普通表单还是带文件的表单
        if (!ServletFileUpload.isMultipartContent(request)) {
            // 如果是一个普通文件,我们可以直接返回
            //如果通过了这个if,说明我们的表单是带文件上传的
            return;
        }
        // 创建上传文件的保存路径。建议保存在WEB-INF下,安全,用户无法直接访问上传的文件
        String uploadPath = this.getServletContext().getRealPath("/WEB-INF/upload");
        System.out.println("文件保存路径-->" + uploadPath);
        File uploadFile = new File(uploadPath);
        // 如果此文件夹不存在就直接创建一个
        if (!uploadFile.exists()) {
            uploadFile.mkdir();
        }

        // 临时路径,假如文件超过了预期大小,我们就把他放入一个临时文件中
        String tempPath = this.getServletContext().getRealPath("/WEB-INF/temp");
        System.out.println("临时文件保存路径-->" + tempPath);
        File tempFile = new File(tempPath);
        if (!tempFile.exists()) {
            tempFile.mkdir();
        }

        // 处理上传的文件,一般需要通过流来获取,我们可以使用request.getInputStream(),原生态的文件上传流获取,十分麻烦
        //但是我们都建议使用Apache的文件上传组件来实现,common-fileupload,他需要依赖commons-io组件


        /**
         *  1.创建DiskFileItemFactory对象:处理文件上传路径或者大小限制的
         */
        DiskFileItemFactory factory = getDiskFileItemFactory(tempFile);

        /**
         * 2.获取ServletFileUpload
         * ServletFileUpload负责处理上传的文件数据,并将表单中每个输入项封装成一个FileItem对象
         * 在使用ServletFileUpload对象解析请求时需要DiskFileItemFactory对象
         * 所以,我们需要在进行解析工作前构造好DiskFileItemFactory对象
         *通过ServletFileUpload对象的构造方法或setFileItemFactory()方法设置ServletFileUpload对象的fileItemFactory属性
         */
        ServletFileUpload upload = getServletFileUpload(factory);

        /**
         *  3.处理上传的文件
         */

        String msg = null;
        try {
            msg = uploadParseRequest(upload, request, uploadPath);
        } catch (FileUploadException e) {
            e.printStackTrace();
        }

        // servlet请求转发消息
        request.setAttribute("msg", msg);
        request.getRequestDispatcher("msg.jsp").forward(request, response);
    }

    public static ServletFileUpload getServletFileUpload(DiskFileItemFactory factory) {
        ServletFileUpload upload = new ServletFileUpload(factory);
        // 监听上传进度
        upload.setProgressListener(new ProgressListener() {
            @Override
            // pBytesRead:已经读到的大小
            // pContentLength:文件大小
            public void update(long pBytesRead, long pContentLength, int i) {
                System.out.println("总大小:" + pContentLength + "已经上传:" + pBytesRead);
            }
        });
        // 处理乱码
        upload.setHeaderEncoding("UTF-8");
        // 设置单个文件的最大值
        upload.setFileSizeMax(1024 * 1024 * 10);
        // 设置总共能够上传文件的大小
        upload.setSizeMax(1024 * 1024 * 10);
        return upload;
    }

    public static DiskFileItemFactory getDiskFileItemFactory(File tempFile) {
        // 通过该工厂设置一个缓冲区,当上传文件大于缓冲区时,将他放到临时文件中
        DiskFileItemFactory factory = new DiskFileItemFactory();
        // 设置缓冲区大小为10M
        factory.setSizeThreshold(1024 * 1024 * 10);
        // 临时目录的保存目录
        factory.setRepository(tempFile);
        return factory;
    }

    public static String uploadParseRequest(ServletFileUpload upload, HttpServletRequest request, String uploadPath)
            throws FileUploadException, IOException {
        String msg = "";
        // 3.把前端请求解析,封装成一个FileItem对象
        List<FileItem> fileItems = upload.parseRequest(request);
        for (FileItem fileItem : fileItems) {
            // 判断上传的文件是普通的表单还是带文件的表单
            if (fileItem.isFormField()) {
                // getFieldName指的是前端表单控件的name;
                String name = fileItem.getFieldName();
                // 处理乱码
                String value = fileItem.getString("UTF-8");
                System.out.println(name + ":" + value);
            } else { // 判断它是上传的文件

                // =======================处理文件===============================//

                // 拿到文件名字
                String uploadFileName = fileItem.getName();
                System.out.println("上传的文件名:" + uploadFileName);

                if (uploadFileName.trim().equals("") || uploadFileName == null) {
                    continue;
                }

                // 获得上传的文件名 /images/girl/paojie.png
                String fileName = uploadFileName.substring(uploadFileName.lastIndexOf("/") + 1);
                // 获得文件的后缀名
                String fileExtName = uploadFileName.substring(uploadFileName.lastIndexOf(".") + 1);
                /*
                 * 如果文件后缀名 fileExtName 不是我们所需要的 就直接return,不处理,告诉用户文件类型不对。
                 */

                System.out.println("文件信息 [件名:" + fileName + "---文件类型" + fileExtName + "]");

                // 可以使用UUID(唯一识别的通用码),保证文件名唯一;
                // UUID.randomUUID(),随机生一个唯一识别的通用码;
                String uuidPath = UUID.randomUUID().toString();

                // =======================处理文件完毕===============================//

                // 存到哪? uploadPath
                // 文件真实存在的路径 realPath
                String realPath = uploadPath + "/" + uuidPath;
                // 给每个文件创建一个对应的文件夹
                File realPathFile = new File(realPath);
                if (!realPathFile.exists()) {
                    realPathFile.mkdir();
                }

                // =======================存放地址完毕===============================//

                // 获得文件上传的流
                InputStream inputStream = fileItem.getInputStream();

                // 创建一个文件输出流
                // realPath = 真实的文件夹;
                // 差了一个文件; 加上输出文件的名字+"/"+uuidFileName
                FileOutputStream fos = new FileOutputStream(realPath + "/" + fileName);

                // 创建一个缓冲区
                byte[] buffer = new byte[1024 * 1024];

                // 判断是否读取完毕
                int len = 0;
                // 如果大于0说明还存在数据;
                while ((len = inputStream.read(buffer)) > 0) {
                    fos.write(buffer, 0, len);
                }

                // 关闭流
                fos.close();
                inputStream.close();

                msg = "文件上传成功!";
                fileItem.delete(); // 上传成功,清除临时文件
                // =======================文件传输完毕===============================//
            }
        }
        return msg;
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}

(6)web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0"
         metadata-complete="false">
		<!--不忽略servlet类上面的注解-->
</web-app>

(7)在IDEA上启动Tomcat服务器并在控制台看输出的结果

在这里插入图片描述
在这里插入图片描述

(8)保存位置
在这里插入图片描述

以上代码开箱即用

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Java Web 应用程序中实现在线编辑 Excel 文件,需要使用 Apache POI 库。 Apache POI 是一个开源的 Java 库,可以用来操作 Microsoft Office 文件格式,包括 Excel、Word 和 PowerPoint。它可以让你在 Java Web 应用程序中读 Excel 文件,并且能够在线编辑这些文件。 要实现在线编辑 Excel 文件,需要在服务器端读取 Excel 文件,然后将数据加载到页面中的表格中。用户可以在表格中修改数据,然后点击提交按钮将修改的数据保存到服务器端的 Excel 文件中。 下面是使用 Apache POI 库实现在线编辑 Excel 文件的简单步骤: 1. 在项目中添加 Apache POI 依赖。 2. 使用 Apache POI 的 Workbook 类读取 Excel 文件。 3. 使用 Apache POI 的 Sheet 类读取 Excel 文件中的工作表。 4. 使用 Apache POI 的 Row 和 Cell 类读取 Excel 文件中的行和单元格。 5. 将读取的数据加载到页面中的表格中。 6. 当用户修改表格中的数据并提交时,使用 Apache POI 的 Workbook 类将修改后的数据回 Excel 文件。 希望这些信息能帮助你。如果你还有其他问题,请随时追问。 ### 回答2: JavaWeb实现在线编辑Excel通过以下步骤完成: 1. 引入Apache POI库:Apache POI是Java操作Microsoft Office格式文档的开源库。在项目中引入Apache POI相关的JAR包。 2. 添加上传功能:在网页中添加上传Excel文件的表单,使用表单上传组件(如Apache Commons FileUpload或SpringMVC提供的MultipartFile)获取上传的文件。 3. 解析Excel文件:使用POI库的API解析上传的Excel文件。可以根据需求选择使用HSSFWorkbook(操作.xls格式)或XSSFWorkbook(操作.xlsx格式)来读取Excel文件。 4. 显示Excel内容:解析Excel文件后,可以将数据存储在Java对象中,然后使用JavaServer Pages(JSP)或Thymeleaf等模板引擎技术将数据渲染在网页中显示。 5. 实现在线编辑功能:在网页中添加编辑Excel的表单,包括输入框、下拉框等控件。通过处理用户的输入,可以更新Java对象中的数据。 6. 更新Excel文件:根据用户的编辑操作,使用POI库的API更新Java对象中的数据。然后将更新后的数据保存回Excel文件中。 7. 下载更新的Excel文件:将更新后的Excel文件提供给用户下载。可以通过设置响应头的Content-Disposition属性来实现文件下载。 8. 错误处理与异常处理:在实现过程中,需要处理可能出现的错误和异常情况,例如上传文件格式不正确、解析Excel文件失败等,提供相应的提示信息或错误处理页面。 以上是使用JavaWeb实现在线编辑Excel的大致流程。通过这种方式,用户可以直接在网页中编辑Excel文件,方便快捷地进行数据处理和更新。 ### 回答3: JavaWeb 实现在线编辑 Excel 可以通过以下步骤实现: 1. 创建一个 Java Web 项目,可以使用 Maven 构建工具简化项目的管理。 2. 导入 Apache POI 库,该库提供了操作 Excel 的功能,可以通过 Maven 或手动下载添加到项目中。 3. 在项目中创建一个用于处理 Excel 的 Servlet,该 Servlet 用于接收并处理前端发送的请求。 4. 前端可以通过表单提交 Excel 文件,或者通过 AJAX 发送 Excel 数据给后端 Servlet 进行处理。 5. 在 Servlet 中,可以使用 POI 库来读取 Excel 文件的内容,或者根据前端传递的数据生成新的 Excel 文件。 6. Servlet 处理完后,将生成的 Excel 文件返回给前端,可以使用响应流输出 Excel 文件。 7. 在前端,可以使用 JavaScript 或其他前端框架来处理接收到的 Excel 文件,例如展示、编辑等。 需要注意的是,由于 Excel 文件的格式复杂,所以在使用 POI 进行操作时需要了解如何读取和操作 Excel 文件的结构和规则。同时,在处理大型 Excel 文件时可能会引起性能问题,所以可以考虑使用缓存、分页等优化技术来提高性能。 另外,为了确保系统的安全性,建议在上传 Excel 文件时进行文件类型和大小的验证,以防止恶意文件的上传和系统资源的耗尽。 总之,通过 JavaWeb 和 Apache POI 库的结合,可以实现在线编辑 Excel 的功能,方便用户在浏览器中直接进行 Excel 数据的修改和操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值