JavaWeb简单文件上传流程的实战记录

JavaWeb简单文件上传实战攻略

简介

本攻略基于JavaWeb开发,帮助初学者快速入门文件上传功能。我们将介绍一个基于Servlet/JSP的简单文件上传例子,包含完整的代码示例、攻略细节和实践体验。

文件上传流程

JavaWeb文件上传可以分为以下几个步骤:

  1. 表单设计 - 创建一个包含 file type input 元素的表单,实现文件上传UI.
  2. 解析文件 - 使用Java Servlet的api,解析multipart/form-data类型的表单数据.
  3. 验证文件 - 对文件大小、类型和命名等方面进行验证,并按需对文件进行压缩加密等操作.
  4. 存储文件 - 将验证合格的文件存储为某种形式,如磁盘上的文件或数据库表格.

下面我们将通过具体的案例加深理解.

示例一

步骤一:表单设计

下面是一个基本的表单设计,适用于文件上传的例子,使用multipart/form-data编码类型:

<form method="post" action="upload.action" enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="submit" value="upload">
</form>

步骤二:解析文件

在Servlet中,我们使用Apache文件上传组件commons-fileupload 来完成文件上传功能。在解析时,要先判断请求的类型以及文件的大小等信息,以便判断文件是否会超过服务器的接收范围。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 文件上传处理:
    DiskFileItemFactory factory = new DiskFileItemFactory();
    // 设定文件最大上传大小
    factory.setSizeThreshold(1024 * 1024 * 10); // 10 MB
    ServletFileUpload upload = new ServletFileUpload(factory);
    upload.setSizeMax(1024 * 1024 * 50); // 50 MB

    // 解析上传文件
    try {
        List<FileItem> items = upload.parseRequest(request);
        for (FileItem item : items) {
            if (!item.isFormField()) { // 非表单数据处理
                String fileName = item.getName();
                // ...
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

步骤三:验证文件

在接收到上传文件后,我们要根据一定的规则进行对文件进行验证,以确保文件的格式和大小符合要求。以下是一个简单的文件验证实现示例:

if (item.getSize() > 1024 * 1024) { // 文件大小不得超过1MB
    System.out.println("File too big!");
    continue;
}
if (!item.getContentType().startsWith("image/")) { // 文件类型必须为图片
    System.out.println("File type error!");
    continue;
}

步骤四:存储文件

解析完成后,我们要将验证合格的文件存储为某种形式,这里我们选择将文件存储在服务器的磁盘上:

String savePath = "data";
File saveDir = new File(savePath);
if (!saveDir.exists()) {
    saveDir.mkdir();
}
String fileName = item.getName();
String filePath = savePath + File.separator + fileName;
File storeFile = new File(filePath);
item.write(storeFile);

示例二

步骤一:表单设计

下面是一个多文件上传的表单设计,使用multipart/form-data编码类型:

<form method="post" action="multiUpload.action" enctype="multipart/form-data">
    <input type="file" name="file" multiple>
    <input type="submit" value="upload">
</form>

步骤二:解析文件

在Servlet中,我们使用Apache文件上传组件commons-fileupload来完成多个文件上传功能:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 多个文件上传处理:
    DiskFileItemFactory factory = new DiskFileItemFactory();
    factory.setSizeThreshold(1024 * 1024 * 10); // 10MB
    ServletFileUpload upload = new ServletFileUpload(factory);
    upload.setSizeMax(1024 * 1024 * 50); // 50MB

    // 解析上传文件
    List<FileItem> items = upload.parseRequest(request);
    // 文件列表
    List<File> files = new ArrayList<>();
    for (FileItem item : items) {
        if (!item.isFormField()) { // 非表单数据处理
            String fileName = item.getName();
            if (fileName == null || fileName.trim().equals("")) {
                continue;
            }
            fileName = fileName.substring(fileName.lastIndexOf(File.separator) + 1);
            File storeFile = new File("data" + File.separator + fileName);
            item.write(storeFile);
            files.add(storeFile);
        }
    }
}

步骤三:验证文件

在接收到上传文件后,我们要根据一定的规则进行对文件进行验证,以确保文件的格式和大小符合要求。以下是一个简单的文件验证实现示例:

Long size = item.getSize();
String contentType = item.getContentType();
if (size > 1024 * 1024) {
    System.out.println("文件大小超出限制!");
}
if (!"image/png".equals(contentType) && !"image/jpg".equals(contentType) && !"image/jpeg".equals(contentType)) {
    System.out.println("文件类型不匹配!");
}

步骤四:存储文件

解析完成后,我们要将验证合格的文件存储为某种形式,这里我们选择将文件存储在服务器的磁盘上:

if (!file.exists()) {
    file.mkdirs();
}
for (File f : files) {
    String filePath = file.getAbsolutePath() + File.separator + f.getName();
    if (!new File(filePath).exists()) {
        f.renameTo(new File(filePath));
    } else {
        System.out.println("文件名已存在!");
    }
}

总结

JavaWeb 文件上传是一个非常常见的功能,同时上传文件的实现也体现出了 Java 服务器端编程中一些重要的技术、原理和开发思想。使用文件上传组件完成文件上传功能,可以大大提高开发效率和文件上传的安全性。

本文中的示例代码仅仅是最基础的Java文件上传实现,实际应用中还需要考虑更多的情况。比如文件上传基于 Ajax 实现时的异常处理、文件重复命名,安全性检查等问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaWeb简单文件上传流程的实战记录 - Python技术站

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

相关文章

  • SpringBoot2.7 WebSecurityConfigurerAdapter类过期配置

    Spring Boot 2.7 版本中,WebSecurityConfigurerAdapter 类过期了,改用了不同的方式进行安全配置。下面我将详细讲解这个过程。 WebSecurityConfigurerAdapter 类过期说明 在 Spring Boot 2.7 版本中,WebSecurityConfigurerAdapter 类被标记为 @Depr…

    Java 2023年5月20日
    00
  • Centos7安装配置tomcat9并设置自动启动的方法

    下面是 “Centos7安装配置tomcat9并设置自动启动的方法” 的完整攻略。 1. 安装Tomcat9 1.1 下载Tomcat9二进制包 到Tomcat的官网https://tomcat.apache.org/download-90.cgi下载对应版本的Tomcat二进制包。 例如,下载 Tomcat 9.0.46 的二进制包 $ curl -O h…

    Java 2023年5月19日
    00
  • java8 Stream流逐行处理文本文件

    下面我将详细讲解一下如何使用Java8的Stream流逐行处理文本文件。 1. 什么是Java8的Stream流? Stream流是Java8引入的一个新特性,它可以将一组数据看作是一条流,在这条流上进行各种操作,比如筛选、排序、映射等操作。其中,最重要的一个特点是Stream流是“懒加载”,只有在真正需要数据的时候才会去加载,这也是其具有高效性的重要原因。…

    Java 2023年5月20日
    00
  • 详解java各种集合的线程安全

    详解java各种集合的线程安全 在多线程程序中,对于集合类的操作可能会涉及到多个线程同时读写,此时需要考虑线程安全的问题。Java提供了许多线程安全的集合类,本篇文章将详细讲述Java中各种集合的线程安全性问题,以及如何使用这些集合类来保证线程安全。 简介 Java中常用的集合类可以分为List、Set和Map三大类。其中,List表示有序的集合,元素可以重…

    Java 2023年5月18日
    00
  • Java读取一行空格隔开的数字字符串并求出这些数字的和方法

    要读取一行空格隔开的数字字符串,并求出这些数字的和,可以按照以下步骤进行: 1. 读取字符串 首先,需要获取用户输入的字符串。可以使用Scanner类来读取用户输入: Scanner scanner = new Scanner(System.in); // 创建Scanner对象 String numsStr = scanner.nextLine(); //…

    Java 2023年5月27日
    00
  • Java中的多态是什么?

    多态是指对象在不同的情况下可以表现出不同的形态。在 Java 中,多态是通过继承和接口实现的。在多态的理念下,我们可以通过父类或接口类型来引用子类或实现类对象。 一个常见的例子是动物,有猫、狗、鸟等各种动物。我们可以定义一个 Animal 类作为这些动物的父类。然后根据不同的情况实现出不同的子类: class Animal { public void spe…

    Java 2023年4月27日
    00
  • java面向对象:API(接口)与集合(ArrayList)

    Java 面向对象:API(接口)与集合(ArrayList)完整攻略 什么是接口 在 Java 编程中,接口是一种抽象类型,它描述了类能做什么而不描述它们是怎么做到的。接口定义了一个类应该有哪些方法,并且不提供这些方法的实现。任何实现这个接口的类都必须提供它定义的方法。 接口的语法如下: // 定义一个接口 public interface Interfa…

    Java 2023年5月26日
    00
  • Java BigDecimal中divide方法案例详解

    下面是关于“Java BigDecimal中divide方法案例详解”的完整攻略: Java BigDecimal中divide方法案例详解 简介 BigDecimal是Java中用于进行精确浮点数计算的类,它可以处理更高精度的计算,避免浮点数精度误差带来的问题。其中,divide方法是BigDecimal类中一个重要的方法,本文将详细讲解其使用方法和案例。…

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