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日

相关文章

  • SpringBoot整合Mybatis与MybatisPlus方法详细讲解

    下面我将为您详细讲解SpringBoot整合Mybatis与MybatisPlus的方法。 1. SpringBoot整合Mybatis 1.1 添加依赖 首先,在pom.xml文件中添加Mybatis和Mybatis-spring-boot-starter的依赖: <dependency> <groupId>org.mybatis.…

    Java 2023年5月19日
    00
  • Ewebeditor 的一些漏洞总结 推荐

    Ewebeditor 的一些漏洞总结 Ewebeditor 是一款常见的 Web 富文本编辑器,但是它也存在着一些安全漏洞。本文将对这些漏洞进行总结,并提供一些示例说明。 漏洞一:目录遍历漏洞 漏洞描述:Ewebeditor 在处理文件上传请求时,未对上传文件的路径进行充分的校验,导致攻击者可以通过构造特殊的上传请求,上传任意文件到服务器中。 漏洞利用:攻击…

    Java 2023年6月16日
    00
  • Sprint Boot @EnableTransactionManagement使用方法详解

    在Spring Boot中,@EnableTransactionManagement注解用于启用事务管理。使用@EnableTransactionManagement注解可以确保在使用@Transactional注解时,Spring Boot能够正确地管理事务。本文将详细介绍@EnableTransactionManagement注解的作用和使用方法,并提供…

    Java 2023年5月5日
    00
  • Java顺序查找算法详解

    Java顺序查找算法详解 什么是顺序查找? 顺序查找,也称线性查找,是一种简单但效率低下的搜索算法,其基本思想是从数据结构的起点开始,顺序扫描整个数据结构,逐个比较查找的值与数据结构中的值,直到找到目标值位置或查找完所有元素为止。 顺序查找算法实现 在Java中,我们可以使用以下的代码实现顺序查找算法: public static int linearSea…

    Java 2023年5月19日
    00
  • Java Spring Controller 获取请求参数的几种方法详解

    下面是关于“Java Spring Controller 获取请求参数的几种方法详解”的完整攻略,包含两个示例说明。 Java Spring Controller 获取请求参数的几种方法详解 在Java Spring应用程序中,Controller是处理HTTP请求的核心组件。在处理请求时,我们通常需要获取请求参数。本文将详细介绍Java Spring Co…

    Java 2023年5月17日
    00
  • 解决MultipartFile.transferTo(dest) 报FileNotFoundExcep的问题

    当使用SpringMVC的MultipartFile上传文件时,可以使用MultipartFile的transferTo(dest)方法将文件保存到指定位置。但是,有时在调用此方法时可能会遇到java.io.FileNotFoundException: xxx不存在异常。这通常是因为在使用transferTo(dest)方法时,目标文件的路径指定不正确,或者…

    Java 2023年5月19日
    00
  • Java编程中的4种代码块详解

    Java编程中的4种代码块详解 在Java程序中,有4种不同类型的代码块可以用来组织代码。这些代码块分别是:静态代码块、实例代码块、构造代码块和同步代码块。下面将详细讲解这4种代码块及其使用方法。 静态代码块 静态代码块是在类加载时执行的代码块,只会被执行一次。它通常用于对静态变量的初始化或处理一些静态资源。 静态代码块的语法如下: static { //代…

    Java 2023年5月30日
    00
  • 详解hibernate自动创建表的配置

    下面是详解Hibernate自动创建表的配置的完整攻略。 概述 Hibernate是一种流行的面向对象关系映射(ORM)框架,可用于将Java对象与关系型数据库(如MySQL)之间进行映射。Hibernate不仅提供了用于执行CRUD(创建、读取、更新和删除)操作的API,还可以自动创建与Java实体类对应的数据库表。在本攻略中,我们将重点探讨Hiberna…

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