JSP组件commons-fileupload实现文件上传

以下是使用JSP组件commons-fileupload实现文件上传的详细攻略:

环境准备

首先需要在项目中引入commons-fileupload组件,可以在Maven中添加以下依赖:

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.4</version>
</dependency>

在JSP页面中需要引入以下标签库:

<%@ taglib uri="http://commons.apache.org/fileupload" prefix="fileupload" %>

文件上传表单

在JSP页面中需要编写一个文件上传的表单,可以通过HTML代码实现:

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

需要设置表单的enctype属性为multipart/form-data,才能支持文件上传。

文件上传处理

在JSP页面的<body>标签中添加以下代码:

<%
    // 指定上传文件的保存目录
    String savePath = "D:/upload";
    File file = new File(savePath);
    if (!file.exists() && !file.isDirectory()) {
        System.out.println("创建目录:" + savePath);
        file.mkdirs();
    }

    // 解析器解析request的上下文
    DiskFileItemFactory factory = new DiskFileItemFactory();
    ServletFileUpload upload = new ServletFileUpload(factory);
    // 设置上传文件的大小限制为100MB
    upload.setFileSizeMax(100 * 1024 * 1024);
    // 设置上传文件的头信息的字符编码
    upload.setHeaderEncoding("UTF-8");

    // 转换request对象,但是这里不能用HttpServletRequest request = (HttpServletRequest) req;
    // 因为我们还需要对请求进行扩展,使用ServletRequest的包装类
    ServletRequest requestWrapper = new RequestWrapper(request);

    // 解析请求,得到文件项集合
    List<FileItem> fileItems = upload.parseRequest(requestWrapper);

    // 遍历文件项集合
    for (FileItem fileItem : fileItems) {
        // 如果是普通表单字段
        if (fileItem.isFormField()) {
            String fieldName = fileItem.getFieldName();
            String fieldValue = fileItem.getString("UTF-8");
            System.out.println("普通表单字段:" + fieldName + " = " + fieldValue);
        } else {
            // 获取上传的文件名称
            String fileName = fileItem.getName();
            System.out.println("上传的文件名:" + fileName);
            // 保存文件
            if (fileName != null && !"".equals(fileName.trim())) {
                fileItem.write(new File(savePath, fileName));
                System.out.println("文件保存成功!");
            }
        }
    }
%>

首先,设置上传文件的保存目录,这里默认保存路径为“D:/upload”,使用时请根据自己的需要修改路径。

然后,创建一个DiskFileItemFactory对象和一个ServletFileUpload对象。

接下来需要创建一个RequestWrapper对象,用于对请求进行扩展。由于在JSP页面中无法直接重写HttpServletRequest对象的方法,因此需要自定义一个RequestWrapper类,继承HttpServletRequestWrapper类:

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class RequestWrapper extends HttpServletRequestWrapper {

    private Map<String, String[]> params = new HashMap<>();

    public RequestWrapper(HttpServletRequest request) throws IOException {
        super(request);
        InputStream in = request.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        String line = null;
        StringBuilder sb = new StringBuilder();
        while ((line = reader.readLine()) != null) {
            sb.append(line);
        }
        String[] paramStrs = sb.toString().split("&");
        for (String paramStr : paramStrs) {
            String[] kv = paramStr.split("=");
            if (kv.length == 2) {
                String key = kv[0];
                String value = kv[1];
                if (params.containsKey(key)) {
                    String[] oldValues = params.get(key);
                    List<String> list = new ArrayList<>();
                    Collections.addAll(list, oldValues);
                    list.add(value);
                    params.put(key, list.toArray(new String[list.size()]));
                } else {
                    params.put(key, new String[]{value});
                }
            }
        }
    }

    @Override
    public String getParameter(String name) {
        String[] values = params.get(name);
        if (values != null && values.length > 0) {
            return values[0];
        }
        return null;
    }

    @Override
    public Enumeration<String> getParameterNames() {
        Set<String> keys = params.keySet();
        Iterator<String> it = keys.iterator();
        List<String> list = new ArrayList<>();
        while (it.hasNext()) {
            list.add(it.next());
        }
        Enumeration<String> en = Collections.enumeration(list);
        return en;
    }

    @Override
    public String[] getParameterValues(String name) {
        return params.get(name);
    }

    @Override
    public Map<String, String[]> getParameterMap() {
        return params;
    }
}

RequestWrapper类中,重写了getParameter()getParameterNames()getParameterValues()getParameterMap()四个方法,用于获取表单提交的参数。

最后,解析出上传的文件,进行保存。

示例一

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="org.apache.commons.fileupload.*" %>
<%@ page import="org.apache.commons.fileupload.disk.*" %>
<%@ page import="org.apache.commons.fileupload.servlet.*" %>
<%@ page import="java.io.*" %>
<%@ taglib uri="http://commons.apache.org/fileupload" prefix="fileupload" %>

<html>
<head>
    <title>文件上传示例</title>
</head>
<body>
<h1>文件上传示例</h1>

<%
    // 指定上传文件的保存目录
    String savePath = "D:/upload";
    File file = new File(savePath);
    if (!file.exists() && !file.isDirectory()) {
        System.out.println("创建目录:" + savePath);
        file.mkdirs();
    }

    // 解析器解析request的上下文
    DiskFileItemFactory factory = new DiskFileItemFactory();
    ServletFileUpload upload = new ServletFileUpload(factory);
    // 设置上传文件的大小限制为100MB
    upload.setFileSizeMax(100 * 1024 * 1024);
    // 设置上传文件的头信息的字符编码
    upload.setHeaderEncoding("UTF-8");

    // 转换request对象,但是这里不能用HttpServletRequest request = (HttpServletRequest) req;
    // 因为我们还需要对请求进行扩展,使用ServletRequest的包装类
    ServletRequest requestWrapper = new RequestWrapper(request);

    // 解析请求,得到文件项集合
    List<FileItem> fileItems = upload.parseRequest(requestWrapper);

    // 遍历文件项集合
    out.println("<ul>");
    for (FileItem fileItem : fileItems) {
        // 如果是普通表单字段
        if (fileItem.isFormField()) {
            String fieldName = fileItem.getFieldName();
            String fieldValue = fileItem.getString("UTF-8");
            out.println("<li>" + fieldName + " = " + fieldValue + "</li>");
        } else {
            // 获取上传的文件名称
            String fileName = fileItem.getName();
            out.println("<li>上传的文件名:" + fileName + "</li>");
            // 保存文件
            if (fileName != null && !"".equals(fileName.trim())) {
                fileItem.write(new File(savePath, fileName));
                out.println("<li>文件保存成功!</li>");
            }
        }
    }
    out.println("</ul>");
%>

</body>
</html>

在这个示例中,简单展示了一个文件上传的页面,使用了<fileupload:file>标签库实现。

示例二

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="org.apache.commons.fileupload.*" %>
<%@ page import="org.apache.commons.fileupload.disk.*" %>
<%@ page import="org.apache.commons.fileupload.servlet.*" %>
<%@ page import="java.io.*" %>
<%@ taglib uri="http://commons.apache.org/fileupload" prefix="fileupload" %>

<html>
<head>
    <title>文件上传示例</title>
</head>
<body>
<h1>文件上传示例</h1>

<form action="upload" method="post" enctype="multipart/form-data">
    <table>
        <tr>
            <td>文件:</td>
            <td><input type="file" name="file"/></td>
        </tr>
        <tr>
            <td colspan="2"><input type="submit" value="上传"/></td>
        </tr>
    </table>
</form>

<%
    // 指定上传文件的保存目录
    String savePath = "D:/upload";
    File file = new File(savePath);
    if (!file.exists() && !file.isDirectory()) {
        System.out.println("创建目录:" + savePath);
        file.mkdirs();
    }

    // 解析器解析request的上下文
    DiskFileItemFactory factory = new DiskFileItemFactory();
    ServletFileUpload upload = new ServletFileUpload(factory);
    // 设置上传文件的大小限制为100MB
    upload.setFileSizeMax(100 * 1024 * 1024);
    // 设置上传文件的头信息的字符编码
    upload.setHeaderEncoding("UTF-8");

    // 转换request对象,但是这里不能用HttpServletRequest request = (HttpServletRequest) req;
    // 因为我们还需要对请求进行扩展,使用ServletRequest的包装类
    ServletRequest requestWrapper = new RequestWrapper(request);

    // 解析请求,得到文件项集合
    List<FileItem> fileItems = upload.parseRequest(requestWrapper);

    // 遍历文件项集合
    out.println("<ul>");
    for (FileItem fileItem : fileItems) {
        // 如果是普通表单字段
        if (fileItem.isFormField()) {
            String fieldName = fileItem.getFieldName();
            String fieldValue = fileItem.getString("UTF-8");
            out.println("<li>" + fieldName + " = " + fieldValue + "</li>");
        } else {
            // 获取上传的文件名称
            String fileName = fileItem.getName();
            out.println("<li>上传的文件名:" + fileName + "</li>");
            // 保存文件
            if (fileName != null && !"".equals(fileName.trim())) {
                fileItem.write(new File(savePath, fileName));
                out.println("<li>文件保存成功!</li>");
            }
        }
    }
    out.println("</ul>");
%>

</body>
</html>

这个示例中,使用HTML代码实现了一个文件上传的表单,通过<input type="file">标签支持文件上传。

以上就是使用JSP组件commons-fileupload实现文件上传的完整攻略,希望能对你有所帮助。

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

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • java小程序之控制台字符动画的实现

    下面我将详细讲解“Java小程序之控制台字符动画的实现”的完整攻略,包含以下几个步骤: 1. 准备工作 确保你已经安装并配置好Java开发环境; 选择一种适合你的集成开发环境(IDE),如Eclipse、IntelliJ IDEA等; 创建一个新的Java项目,并定义一个新的类用于实现动画。 2. 实现控制台字符动画 2.1 定义动画字符 首先,我们需要定义…

    Java 2023年5月23日
    00
  • Java常用集合与原理解析

    Java常用集合与原理解析 集合概述 Java中提供的集合框架是一个用于存储和处理数据的统一框架。集合框架可以存储在内存中,也可以存储在磁盘或数据库中。常用的集合有 List,Set 和 Map 等,它们都是接口,它们的具体实现由不同的类实现。 集合分类 Java中的集合框架可以分为以下两大类: Collection 接口:它是所有集合框架的根,该接口规定了…

    Java 2023年5月26日
    00
  • Java简易计算器程序设计

    下面我就给您讲解Java简易计算器程序设计的完整攻略。 1. 确定需求 在开始设计Java简易计算器程序之前,我们需要先明确需求,即我们要实现什么样的功能。在这里,我们可以列出计算器程序的基本功能: 支持基本的加减乘除四则运算 支持小数计算 支持括号功能 2. 设计代码框架 在明确需求之后,我们需要开始设计Java程序的代码框架。我们可以将计算器程序分成以下…

    Java 2023年5月23日
    00
  • Java中常用修饰符的使用方法汇总

    Java中常用修饰符的使用方法汇总 在Java中,修饰符是一种关键字,用于修饰类、变量、方法等结构的访问权限、范围等特征。本文将会详细讲解Java中常用修饰符的使用方法,帮助读者更好地理解和掌握Java编程。 访问修饰符 Java中访问修饰符包括public、protected、default和private四种,它们分别控制着变量、方法和类的访问权限。下面…

    Java 2023年5月26日
    00
  • java中字符串与日期的转换实例

    我们来详细讲解一下“java中字符串与日期的转换实例”的完整攻略。 1. 字符串转日期 在Java中,可以用SimpleDateFormat类的parse方法来将字符串转换成日期对象。具体步骤如下: (1)创建SimpleDateFormat实例: SimpleDateFormat sdf = new SimpleDateFormat("yyyy-…

    Java 2023年6月1日
    00
  • maven scope provided和runtime的例子说明

    Maven是Java项目中十分常用的构建工具,它提供了一系列功能和机制来管理项目中的依赖。Maven中的“scope”是指依赖范围,即描述一个依赖在何种情况下可用的属性。Maven中常用的依赖范围主要有compile、provided、runtime、test和system。 其中,provided和runtime经常一起使用,我们来详细讲解一下它们的区别和…

    Java 2023年6月2日
    00
  • 带你深入概括Java!六、方法和方法重载!(推荐)

    带你深入概括Java!六、方法和方法重载!(推荐) 方法的定义 Java中的方法(Method)是一段可以被重复使用的代码块,它封装了特定的功能,一般用来解决一类问题。在Java中,方法通常包括方法头和方法体两个部分,语法如下: 修饰符 返回值类型 方法名(参数列表) { // 方法体 } 其中,修饰符是可选的,如果没有修饰符,则默认为public;返回值类…

    Java 2023年5月26日
    00
  • Sprint Boot @Scheduled使用方法详解

    Spring Boot的@Scheduled注解 在Spring Boot中,@Scheduled注解用于标记一个方法为定时任务。使用@Scheduled注解可以指定方法在何时执行,例如每隔一段时间执行一次,或在特定的时间执行。本文将详细介绍@Scheduled注解的作用和使用方法,并提供两个示例说明。 @Scheduled注解作用 在Spring Boot…

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