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日

相关文章

  • 本地编译打包项目部署到服务器并且启动方式

    下面是本地编译打包项目部署到服务器并且启动方式的完整攻略: 准备工作 确定服务器的操作系统、IP地址、用户名和密码等信息。 确认服务器是否已经安装项目依赖的环境(例如Node.js、Java等)。 安装需要的打包工具(例如Maven、Gradle等),并且熟悉其中的一种。 步骤说明 以下是部署项目到服务器的步骤: 步骤一:本地编译打包项目 使用打包工具对项目…

    Java 2023年5月26日
    00
  • Hibernate Validator实现更简洁的参数校验及一个util

    那我来为您讲解一下Hibernate Validator实现更简洁的参数校验及一个util的完整攻略。 1. 简介 Hibernate Validator是一个基于Java Bean验证规范(JSR-303,JSR-349)的校验框架,可以用来校验JavaBean中的字段,包括对基本类型、日期、字符串等数据类型的支持。Hibernate Validator提…

    Java 2023年5月20日
    00
  • SpringBoot 中常用注解及各种注解作用

    来详细讲解一下SpringBoot中常用注解及各种注解作用的攻略。 1. @SpringBootApplication 这是一个复合注解,包含了@Configuration、@EnableAutoConfiguration和@ComponentScan三个注解。 @Configuration:表示这是一个配置类,可以用来替代xml配置文件。 @EnableA…

    Java 2023年5月15日
    00
  • java开发AOP面向切面编程入门

    Java AOP面向切面编程入门攻略 什么是AOP编程 AOP(AspectOriented Programming),即面向切面编程,是OOP编程模式的一种补充。AOP编程是通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。 在传统的OOP编程中,我们将所有重复出现的代码封装到相应的模块或类中,实现代码复用。通过继承或组合等方式,可以将这些…

    Java 2023年5月19日
    00
  • 详解Java中用于国际化的locale类

    详解Java中用于国际化的Locale类 Locale类是Java用于处理地域性信息的一个重要类,在Java中,通常用来做国际化和本地化。 什么是Locale类? Locale是一个Java类,它代表一个特定的地域、文化和语言环境。它包含了一些常见的属性,如语言、国家和地区等。Locale类提供了一种标准的方式来处理本地化和国际化内容。 如何使用Locale…

    Java 2023年5月26日
    00
  • Spring装配Bean之用Java代码安装配置bean详解

    下面我将详细讲解使用Java代码进行Spring Bean的装配配置的完整攻略。 1. 概述 Spring框架的一个重要特点就是使得Bean配置非常灵活。在Spring中,我们可以用XML、Java注解或者纯Java代码等多种方式来实现对Bean的装配配置。其中,使用Java代码的方式可以减少XML配置文件的复杂度,同时也可以提高程序的可读性和灵活性。 2.…

    Java 2023年6月15日
    00
  • Spring MVC 与 CORS跨域的详细介绍

    Spring MVC 与 CORS跨域的详细介绍 在Web开发中,跨域请求是一种常见的需求。CORS(Cross-Origin Resource Sharing)是一种机制,它允许Web应用程序从不同的域访问其资源。本文将详细介绍Spring MVC与CORS跨域的相关知识,并提供两个示例说明。 CORS跨域的实现原理 CORS跨域的实现原理是通过在HTTP…

    Java 2023年5月17日
    00
  • Java常用加密算法实例总结

    Java常用加密算法实例总结 在Java开发过程中,常常需要对数据进行加密和解密处理。为了实现这个目的,Java引入了多种加密算法,本文将对Java常用的加密算法进行总结,并给出两个示例说明。 对称加密算法 对称加密算法指的是加密和解密使用相同密钥的算法。它的特点是加密和解密速度快,但密钥容易泄露。Java支持的对称加密算法有DES、3DES和AES。 DE…

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