JavaWeb实现文件上传与下载的方法

JavaWeb实现文件上传与下载的方法

上传文件

文件上传步骤:

  1. 在表单中设置表单属性 enctype="multipart/form-data",使表单支持文件上传;
  2. 在服务器端获取表单数据,通过 request.getPart("file") 和 Part.getInputStream() 方法获取上传的文件流;
  3. 将文件流保存到指定的文件中,可以使用 FileOutputStream 或者 IOUtils.copy() 方法。

下面是一个文件上传的示例代码:

服务器端代码

@WebServlet("/upload")
public class FileUploadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        //存储文件的目录
        String savePath = request.getSession().getServletContext().getRealPath("/WEB-INF/upload");
        File file = new File(savePath);
        //如果文件夹不存在则创建
        if(!file.exists() && !file.isDirectory()){
            file.mkdir();
        }

        Part part = request.getPart("file");
        String fileName = getFileName(part);
        part.write(savePath + File.separator + fileName);
        response.getWriter().write("文件上传成功!");
    }

    /*获取上传的文件名*/
    private String getFileName(final Part part) {
        final String header = part.getHeader("content-disposition");
        for (String content : header.split(";")) {
            if (content.trim().startsWith("filename")) {
                return content.substring(content.indexOf('=') + 1).trim().replace("\"", "");
            }
        }
        return null;
    }
}

客户端代码

<form method="POST" action="${pageContext.request.contextPath}/upload" enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="submit" value="上传">
</form>

下载文件

文件下载步骤:

  1. 在服务器端根据文件名获取文件路径,并将文件以流的形式输出给客户端;
  2. 使用 OutputStream 将文件输出给客户端,可以采用 IOUtils.copy() 方法。

下面是一个文件下载的示例代码:

服务器端代码

@WebServlet("/download")
public class FileDownloadServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        String fileName = request.getParameter("filename");
        String filePath = request.getSession().getServletContext().getRealPath("/WEB-INF/upload") + File.separator + fileName;
        File file = new File(filePath);

        response.setContentType(getServletContext().getMimeType(fileName));
        response.setHeader("Content-Disposition", "attachment;filename=" + fileName);

        InputStream inputStream = new FileInputStream(file);
        OutputStream outputStream = response.getOutputStream();
        IOUtils.copy(inputStream, outputStream);
        inputStream.close();
        outputStream.close();
    }
}

客户端代码

<a href="${pageContext.request.contextPath}/download?filename=xxx.jpg">下载</a>

在上述的示例代码中,需要注意的是:

  1. 文件上传性能方面,如果上传文件比较大,推荐使用 Apache Commons FileUpload 组件;
  2. 文件下载性能方面,如果下载文件比较大,推荐使用 NIO 或者大文件分段下载方式。

以上就是 JavaWeb 实现文件上传与下载的攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaWeb实现文件上传与下载的方法 - Python技术站

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

相关文章

  • Java开发岗位面试被问到反射怎么办

    当你在Java开发面试时被问到反射相关的问题时,需要详细解释反射的概念和使用方法,以及反射在实际项目中的应用。 以下是完整的攻略流程: 1. 理解反射的概念 反射是Java语言的一种特性,可以在运行时动态获取类的信息并操作对象。反射可以使代码更加灵活和可扩展,但过度使用反射也会导致代码难以维护和调试。因此,反射的使用应该谨慎,并在适当的情况下使用。 2. 学…

    Java 2023年5月26日
    00
  • 一文详解Java中枚举类的使用

    一文详解Java中枚举类的使用 什么是枚举类? 枚举类是一种特殊的类,它用于表示一组常量。我们通常用它们来代表一个有限的取值范围。在Java中,枚举类是用enum关键字定义的。 枚举类的定义 定义一个枚举类非常简单,只需要使用enum关键字定义即可。例如,定义一个表示星期的枚举类: public enum Weekday { MONDAY, TUESDAY,…

    Java 2023年5月26日
    00
  • Java中创建对象的6种方式

    当我们学习Java编程语言时,经常需要创建对象,Java中创建对象的方式有很多种。本文将介绍Java中创建对象的6种方式,以及每种方式的具体实现和示例。以下是详细攻略: 1.使用new关键字创建对象 使用Java中的new关键字可以创建对象。具体实现为:先声明一个类的变量,然后通过new关键字和类的构造函数来创建对象。 示例: //声明一个变量来保存对象 P…

    Java 2023年5月26日
    00
  • Spring与Struts整合之让Spring管理控制器操作示例

    首先介绍一下Spring和Struts的整合。在传统的Struts应用中,Struts DispatchAction负责将不同的请求分发给对应的Action进行处理。而在整合了Spring之后,Spring的IoC容器能够负责管理Struts的Action类,将这些Action类作为Spring的Bean进行管理,从而赋予了Struts更强大的扩展能力和灵活…

    Java 2023年5月20日
    00
  • Springboot引入hibernate配置自动建表并进行增删改查操作

    下面是详细的步骤: 1. 添加依赖 在pom.xml文件中添加以下依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> &l…

    Java 2023年5月19日
    00
  • spring security自定义认证登录的全过程记录

    下面是关于“spring security自定义认证登录的全过程记录”的详细攻略: 背景 Spring Security是Spring家族中重要的一员,主要用于Web应用的安全框架。它可以实现对应用的URL、方法和资源进行保护,在身份验证和授权方面提供了全面的支持。其中认证是指确认用户身份,而授权是指决定用户可以访问系统哪些资源。Spring Securit…

    Java 2023年5月19日
    00
  • spring-mybatis获取mapper的四种方式汇总

    下面是对于“spring-mybatis获取mapper的四种方式汇总”的完整攻略。 1. 前言 在 Spring 中使用 Mybatis 时,我们需要获取Mapper类,通俗点来讲就是要实例化一个Mapper类对象,从而调用方法去操作数据库。 Spring-Mybatis 提供了四种方式来获取Mapper类实例化对象。 这四种方式是: 通过 SqlSess…

    Java 2023年5月19日
    00
  • Java中Properties类的操作实例详解

    Java中Properties类的操作实例详解 Properties类是什么? Properties类是Java中常用的一个类,主要用于处理属性文件。属性文件是一种配置文件,其中包含了键值对,用于保存程序运行时需要动态设置的参数值,例如数据库连接参数、日志输出级别等等。 Properties类的基本用法 Properties类位于java.util包中,可以…

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