jsp+servlet简单实现上传文件功能(保存目录改进)

yizhihongxing

下面我会详细讲解“jsp+servlet简单实现上传文件功能(保存目录改进)”的完整攻略。

1. 基本介绍

在Java Web开发中,如果需要实现文件上传功能,可以使用jsp+servlet技术实现。具体实现过程中需要用到JDK提供的multipart/form-data类型数据处理方式。下面我们来看看如何实现。

2. 实现步骤

  • 一、创建html页面,页面中包含一个表单,用于上传文件,表单中需要指定form表单的enctype为multipart/form-data。

示例代码:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<form action="FileUploadServlet" method="post" enctype="multipart/form-data">
    <input type="file" name="f">
    <input type="submit" value="上传">
</form>
</body>
</html>

注意:form表单action中的FileUploadServlet是一个后台servlet的路径,需要在后台中对应的servlet中处理文件上传请求。

  • 二、在后台servlet中创建一个实现javax.servlet.http.Part接口的文件上传处理类,用于处理文件上传请求的中间件:

示例代码:

package com.example.servlet;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

@WebServlet("/FileUploadServlet")
@MultipartConfig(
        fileSizeThreshold = 1024 * 1024,
        maxFileSize = 1024 * 1024 * 5,
        maxRequestSize = 1024 * 1024 * 20,
        location = "E:/file/"
)
public class FileUploadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Part part = request.getPart("f");
        if (part != null && part.getSize() > 0) {
            InputStream inputStream = part.getInputStream();
            String fileName = part.getSubmittedFileName();
            String fileSuffix = fileName.substring(fileName.lastIndexOf("."));
            String uuid = UUID.randomUUID().toString().replace("-", "");
            fileName = uuid + fileSuffix;
            String uploadPath = getServletContext().getRealPath("") + File.separator + "file" + File.separator + fileName;
            Files.copy(inputStream, Paths.get(uploadPath));
            part.delete();
        }
    }
}

以上示例代码中的MultipartConfig注解用于设置文件上传相关参数:

  • fileSizeThreshold:最大缓冲区缓存大小,默认为0,即不缓存。
  • maxFileSize:最大文件上传大小。
  • maxRequestSize:最大请求大小。
  • location:上传文件的保存路径。如果不指定该值,则会默认保存在tomcat临时目录中。

  • 三、运行该项目,访问前台上传文件页面,上传一个大小小于5MB的文件。在实现的例子中,上传的文件将会被存储在E:/file/目录下。

3. 注意事项

  • 1.表单需要设置enctype为multipart/form-data。
  • 2.实现servlet需要使用javax.servlet.http.Part接口,它是Servlet 3.0规范引入的新特性,所以需要使用Servlet 3.0或以上的版本。
  • 3.通过getServletContext().getRealPath("")获取的是该项目在tomcat中的真实路径。在实际开发中,路径应该设置为可配置(例如:写入配置文件或者通过配置文件等方式对外提供),以便部署在其他tomcat服务器上时可以方便地修改该路径。

4. 示例说明

下面两个示例,分别演示了如何实现多文件上传和跨域上传。

示例一:多文件上传示例

在前台页面中添加多个文件上传框,修改servlet的处理代码部分,实现批量文件上传功能。

示例代码:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<form action="FileUploadServlet" method="post" enctype="multipart/form-data">
    <input type="file" name="f1"><br>
    <input type="file" name="f2"><br>
    <input type="file" name="f3"><br>
    <input type="submit" value="上传">
</form>
</body>
</html>
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String uploadPath = getServletContext().getRealPath("") + File.separator + "file" + File.separator;
    Collection<Part> parts = request.getParts();
    for (Part part : parts) {
        if (part != null && part.getSize() > 0) {
            InputStream inputStream = part.getInputStream();
            String fileName = part.getSubmittedFileName();
            String fileSuffix = fileName.substring(fileName.lastIndexOf("."));
            String uuid = UUID.randomUUID().toString().replace("-", "");
            fileName = uuid + fileSuffix;
            Files.copy(inputStream, Paths.get(uploadPath + fileName));
            part.delete();
        }
    }
}

示例二:跨域上传示例

在前台页面中添加一个可跨域上传的文件上传框,修改servlet的处理代码部分,实现跨域上传功能。

示例代码:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<form action="FileUploadServlet" method="post" enctype="multipart/form-data">
    <input type="file" name="f"><br>
    <input type="hidden" name="callback" value="http://localhost:8080/crossDomainTest.html">
    <input type="submit" value="上传">
</form>
</body>
</html>

注意:在跨域上传中,需要在form表单中添加一个隐藏的callback参数,用于返回上传结果。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String uploadPath = "E:/file/";
    Part part = request.getPart("f");
    if (part != null && part.getSize() > 0) {
        InputStream inputStream = part.getInputStream();
        String fileName = part.getSubmittedFileName();
        String fileSuffix = fileName.substring(fileName.lastIndexOf("."));
        String uuid = UUID.randomUUID().toString().replace("-", "");
        fileName = uuid + fileSuffix;
        String uploadFilePath = uploadPath + fileName;
        Files.copy(inputStream, Paths.get(uploadFilePath));
        part.delete();
        String callbackUrl = request.getParameter("callback");
        response.setContentType("application/json;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.print("{\"code\": 0, \"info\": \"success\", \"fileName\": \"" + fileName + "\", \"fileUrl\": \"" + uploadFilePath + "\", \"callback\": \"" + callbackUrl + "\"}");
        out.flush();
        out.close();
    }
}

在处理上传文件成功后,需要向前台返回一个json格式的信息,包含上传结果等详细信息。

以上就是“jsp+servlet简单实现上传文件功能(保存目录改进)”的完整攻略。希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:jsp+servlet简单实现上传文件功能(保存目录改进) - Python技术站

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

相关文章

  • 常用一些Javascript判断函数

    下面是”常用一些Javascript判断函数”的完整攻略,包括作用、语法和示例说明。 一. 常用的Javascript判断函数 在Javascript编程中,我们常常需要使用一些判断函数来进行条件判断,比如为空判断、类型判断、是否相等判断等等,下面是常用的几个函数: 1. 判断数据的类型 我们经常需要判断一个变量是不是某个类型的数据,Javascript提供…

    JavaScript 2023年5月27日
    00
  • 详解ES6之用let声明变量以及let loop机制

    以下是关于“详解ES6之用let声明变量以及let loop机制”的完整攻略: 一、let声明变量 ES6中新增了let关键字,用于声明变量。let作用域是块级的作用域,而不是全局作用域。 1. let的基本使用 使用let声明变量,可以通过相同的语法进行赋值和修改值。例如: let count = 1; count = 2; console.log(cou…

    JavaScript 2023年6月10日
    00
  • JavaScript判断文件是否存在的实例代码

    下面是详细讲解 JavaScript 判断文件是否存在的完整攻略。 问题描述 有时我们需要在 JavaScript 中判断某个文件是否存在,这在处理文件上传、下载等场景中很常见。那么如何用 JavaScript 判断文件是否存在呢?我们分别从前端和后端两个方面进行说明。 前端方案 前端方案是通过发送 HTTP 请求,并监听响应状态码来判断文件是否存在。 下面…

    JavaScript 2023年5月27日
    00
  • 在JavaScript中处理字符串之fontcolor()方法的使用

    在JavaScript中处理字符串之fontcolor()方法的使用 简介 JavaScript 提供了一些内置方法,用来处理字符串,其中之一就是 fontcolor() 。 fontcolor() 方法用于创建带有指定颜色的 HTML <font> 标签,用于改变文本颜色。 该方法接受一个参数 color,该参数是一个字符串,值为想要应用的颜色…

    JavaScript 2023年5月28日
    00
  • 原生JS实现动态加载js文件并在加载成功后执行回调函数的方法

    实现动态加载 js 文件是网页开发中常见的需求,可以用于按需加载某些功能模块,减轻网页初始加载时的压力。同时,当加载完成时,需要执行相应的回调函数,以便进行后续的操作。下面是实现原生 JavaScript 实现动态加载 js 文件并执行回调函数的完整攻略: 1. 原生JS实现动态加载js文件 我们可以通过创建一个 script 标签来实现动态加载 js 文件…

    JavaScript 2023年5月27日
    00
  • javascript中contains是否包含功能实现代码(扩展字符、数组、dom)

    JavaScript中的contains方法用于检查一个字符串、数组或DOM元素是否包含指定内容。它会在传入的字符串、数组或DOM元素中查找指定内容,如果找到则返回true,否则返回false。 下面我将为您提供在不同场景下实现contains功能的完整攻略。 使用ECMAScript 6中的includes方法实现contains 在ECMAScript …

    JavaScript 2023年6月10日
    00
  • Javascript模块导入导出详解

    下面是Javascript模块导入导出详解的完整攻略。 什么是Javascript模块 Javascript模块是Javascript中的一种代码组织方式,它将代码分割成更小的、更易于维护的模块,每个模块都有自己的作用域和功能。模块可以包含变量、函数、类等,通过模块的方式来导入和导出这些内容,可以实现模块化开发的效果。 模块的导出 Javascript模块的…

    JavaScript 2023年5月27日
    00
  • 通过实例了解JS执行上下文运行原理

    JS执行上下文(execution context)是JS解释器在处理JS代码时,创建的一个对象,用来管理和维护当前代码的执行环境,包括当前作用域内的变量、函数声明、this指向和外部环境等相关信息。本文将通过两条实例,来深入了解JS执行上下文的运行原理。 执行上下文的创建过程 在JS解释器执行JS代码之前,首先会创建一个全局上下文(Global Execu…

    JavaScript 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部