java实现文件上传功能

现在我会为您提供一个详细的java实现文件上传功能的攻略。包括需要用到的技术和代码示例。

技术所需

1. HTML表单

文件上传需要 HTML 表单,因为文件上传是通过 HTTP POST 请求提交的。

表单应该具有:enctype="multipart/form-data" 属性。

2. Servlet API

Servlet API提供了上传文件的功能,并解决了以下问题:

  1. 处理多部件(multi-part)请求。

  2. 提供对文件上传的接口和 api 。

  3. 读取表单字段的值。

3. Apache Commons File Upload

Apache Commons File Upload 是一个流行的文件上传 api,这是一个开源项目,可以轻松处理文件上传。

完整的流程

  1. 创建:实现 JSP/Servlet 页面,用于读取文件。页面应该为空,只有一个文件上传按钮,等待用户上传文件。

  2. HTML表单:创建.jsp文件,这将包含 HTML 表单。

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Servlet File Upload</title>
</head>
<body style="text-align:center;">

<h2>选择文件并上传</h2>
<form method="post" action="UploadServlet" enctype="multipart/form-data">
    <p>
        <input type="file" name="file" />
        <br/><br/>
        <input type="submit" value="上传"/>
    </p>
</form>

</body>
</html>
  1. 上传服务端程序:实现一个 servlet 用于上传从用户获取的文件并将其保存在服务器端。
@WebServlet("/UploadServlet")
@MultipartConfig
public class UploadServlet extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //获取文件
    Part filePart = request.getPart("file");
    String fileName = filePart.getSubmittedFileName();
    InputStream fileContent = filePart.getInputStream();

    //存储文件
    String appPath = request.getServletContext().getRealPath("");
    String fullPath = appPath + File.separator + "upload" + File.separator + fileName;
    FileOutputStream out = new FileOutputStream(new File(fullPath));
    IOUtils.copy(fileContent, out);

    //文件上传完成后转发
    request.setAttribute("message", "上传成功");
    getServletContext().getRequestDispatcher("/uploadResult.jsp").forward(request, response);
    }
}
  1. 存储文件:从表单获得的文件将被存储在本地文件系统中。在文件被存储后,上传服务户端程序将转发到上传结果页面:
//存储文件
 String appPath = request.getServletContext().getRealPath("");
    String fullPath = appPath + File.separator + "upload" + File.separator + fileName;
    FileOutputStream out = new FileOutputStream(new File(fullPath));
    IOUtils.copy(fileContent, out);

//文件上传完成后转发
request.setAttribute("message", "上传成功");
getServletContext().getRequestDispatcher("/uploadResult.jsp").forward(request, response);
  1. 上传结果:在上传完成时,可以使用JSP页面来显示上传结果。
<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>文件上传结果</title>
</head>
<body style="text-align: center;">
<h2>${message}</h2>
<a href="<%=request.getContextPath()%>/index.jsp">返回</a>
</body>
</html>

至此,java实现文件上传功能就完成了。

以下是一个使用Apache Commons FileUpload的文件上传示例:

String appPath = request.getServletContext().getRealPath("");
String savePath = appPath + File.separator + UPLOAD_DIR;

// 创建文件上传工厂实例
DiskFileItemFactory factory = new DiskFileItemFactory();

// 设置内存临界值,超过后将产生临时文件并存储于临时目录中
factory.setSizeThreshold(MAX_MEMORY_SIZE);

// 设置临时存储目录
factory.setRepository(new File(System.getProperty("java.io.tmpdir")));

// 创建一个新的文件上传处理程序
ServletFileUpload upload = new ServletFileUpload(factory);

// 设置最大文件上传值
upload.setFileSizeMax(MAX_FILE_SIZE);

// 设置最大请求值 (包含文件和表单数据)
upload.setSizeMax(MAX_REQUEST_SIZE);

// 可以上传的文件格式
upload.setFileItemFactory(new FileItemFactory() {
   @Override
   public FileItem createItem(String fieldName, String contentType, boolean isFormField, String fileName) {
      String[] supportedMimeTypes = {"image/jpeg", "image/png", "image/gif"};
      for (String supportedMimeType : supportedMimeTypes) {
         if (contentType.equals(supportedMimeType)) {
            return new DiskFileItem(fieldName, contentType, isFormField, fileName);
         }
      }
      return null;
   }
});

// 使用文件上传工具解析请求并提取文件
List<FileItem> formItems = upload.parseRequest(request);
if (formItems != null && formItems.size() > 0) {
   // 迭代表单数据
   for (FileItem item : formItems) {
      // 处理不在表单中的字段
      if (!item.isFormField()) {
         String fileName = new File(item.getName()).getName();
         String filePath = savePath + File.separator + fileName;
         File storeFile = new File(filePath);

         // 在控制台输出文件的上传路径
         System.out.println(filePath);

         // 保存文件到硬盘
         item.write(storeFile);
         request.setAttribute("message", "文件上传成功!");
      }
   }
}

以上就是Java实现文件上传的详细攻略,希望对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java实现文件上传功能 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Java 中的变量类型

    Java 中的变量类型 Java 是一种强类型语言,也就是说每个变量在声明时都必须指定一个明确的数据类型。Java 支持以下八种基本数据类型: 整型 byte: 字节型,占用 1 个字节,取值范围为 -128 到 +127。 short: 短整型,占用 2 个字节,取值范围为 -32768 到 +32767。 int: 整型,占用 4 个字节,取值范围为 -…

    Java 2023年5月26日
    00
  • java的Hibernate框架报错“ObjectDeletedException”的原因和解决方法

    当使用Java的Hibernate框架时,可能会遇到“ObjectDeletedException”错误。这个错误通常是由于以下原因之一引起的: 对已删除的实体进行操作:如果您尝试对已删除的实体进行操作,则可能会出现此错误。在这种情况下,需要检查实体是否已被删除,并避免对已删除的实体进行操作。 并发访问问题:如果多个线程同时访问同一个实体,则可能会出现此错误…

    Java 2023年5月4日
    00
  • 详解Spring中@Valid和@Validated注解用法

    下面是一份详解Spring中@Valid和@Validated注解用法的完整攻略。 什么是@Valid和@Validated 在Spring框架中,我们经常会使用Controller层来接收前端发送的HTTP请求,处理业务逻辑并返回响应。而在参数校验环节,我们就可以使用@Valid和@Validated注解,实现自动校验请求参数的功能。 @Valid注解用于…

    Java 2023年5月20日
    00
  • java 连接sql server2008数据库配置

    下面是详细讲解“Java 连接 SQL Server 2008 数据库配置”的完整攻略。 环境准备 首先,你需要有一个 SQL Server 2008 数据库,并且已经打开了 TCP/IP 协议,开放了端口。可以在 SQL Server Configuration Manager 中查看和修改。 其次,需要下载 SQL Server JDBC 驱动程序。可以…

    Java 2023年5月19日
    00
  • JavaScript 函数replace深入了解

    JavaScript 函数replace深入了解 什么是replace函数? replace()是 JavaScript 内置函数之一,它用于在字符串中替换与某个模式匹配的子字符串。replace()函数有两个参数,第一个参数是要替换的内容,可以是字符串或 正则表达式 ;第二个参数是新内容。 语法 string.replace(searchValue, re…

    Java 2023年6月15日
    00
  • java求数组最大值和最小数示例分享

    Java求数组最大值和最小值示例分享 在Java开发中,我们经常需要对数组中的元素进行操作。其中,求出数组的最大值和最小值是常见操作之一。下面我们将会介绍两种不同的方法来求数组的最大值和最小值。 方法一: 遍历比较法 遍历比较法是一种简单粗暴的方法。我们可以通过循环遍历数组中的每一个元素,并且在遍历的过程中与当前的最大值或最小值进行比较。当我们遍历完整个数组…

    Java 2023年5月26日
    00
  • java实现快速打字游戏

    Java实现快速打字游戏攻略 1. 确定需求与设计游戏逻辑 在实现Java快速打字游戏之前,我们首先需要确定游戏的需求和逻辑。快速打字游戏的目的是测试玩家的打字速度和准确性,因此我们需要设计以下功能: 随机生成需要玩家打出的单词/短语,并记录玩家的打字时间和准确性; 显示玩家的打字速度和准确性,并根据不同的表现给出不同的提示。 在确定需求和设计逻辑之后,我们…

    Java 2023年5月19日
    00
  • log4j2的高并发死锁问题配置优化方式

    下面是关于“log4j2的高并发死锁问题配置优化方式”的完整攻略。 问题描述 在高并发场景下,log4j2可能会出现死锁问题。 这是由于log4j2的异步日志功能(Async Appenders)的工作方式导致的。Async Appenders需要将所有的日志事件都放在一个队列中,并在后台的线程中执行写入操作。但是当日志写入速度超过异步日志工作线程的处理速度…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部