板块一 Servlet编程:第八节 文件上传下载操作 来自【汤米尼克的JavaEE全套教程专栏】

本文主要是介绍板块一 Servlet编程:第八节 文件上传下载操作 来自【汤米尼克的JavaEE全套教程专栏】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

板块一 Servlet编程:第八节 文件的上传下载操作

  • 一、文件上传
    • (1)前端内容
    • (2)后端内容
  • 二、文件下载
    • (1)前端的超链接下载
    • (2)后端下载

在之前的内容中我们终于结束了Servlet五大对象的学习,我们发现这些对象在操作数据时往往只是简单的参数传递,那我们该如何操作更复杂的资源呢?比如要在后端上传下载一个文件,这一节完善一个Servlet的重要知识,就是文件的上传下载操作

一、文件上传

(1)前端内容

  1. 使用表单提交
  2. 设置表单的提交类型为POST请求 method="post"
  3. 设置表单类型为文件上传表单 enctype="multipart/form-data"
  4. 设置文件提交的地址
  5. 准备表单元素
    - 普通的表单项 type="text"
    - 文件项 type="file"
  6. 设置表单元素的name属性值(表单提交一定要设置表单元素的name属性值,否则后台无法接收数据!)

html code

<form method="post" enctype="multipart/form-data" action="uploadServlet">姓名:<input type="text" name="uname" > <br>文件:<input type="file" name="myfile"> <br><!-- button默认的类型是提交类型 type="submit" --><button>提交</button>
</form>

在这里插入图片描述

(2)后端内容

使用注解 @MultipartConfig 将一个Servlet标识为支持文件上传。Servlet将multipart/form-data
POST 请求封装成一个Part对象,通过Part对象的方法对上传的文件进行操作。

实例,详解见代码注释

package com.TommyNike.servlet;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;
import java.io. IOException;@webServlet("/uploadservlet") //与前端的表单的action一致
@MultipartConfig // 如果是文件上传表单,一定要加这个注解
public class Uploadservlet extends HttpServlet {@override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {request.setCharacterEncoding("UTF-8"); // 设置请求的编码格式// 获取普通表单项 (文本框)String uname= request.getParameter("uname");  //"uname"与文本框的name属性值一致// 通过 getPart(name)方法获取Part对象 (name代表的是页面中file文件域的name属性值)Part part = request.getPart("myfile");// 通过Part对象,获取上传的文件名String fileName = part.getSubmittedFileName();// 获取上传文件需要存放的路径 (得到项目存放的真实路径)String realPath = request.getServletContext().getRealPath("/");// 将文件上传到指定位置part.write(realPath + fileName);}
}

注意:
只要前端表单的属性值为enctype="multipart/form-data",即表单的类型为文件上传表单,Servlet后端就一定要加注解@MultipartConfig,否则表单的内容无法传递到后端

二、文件下载

文件下载,即将服务器上的资源下载(拷贝)到本地,我们可以通过两种方式下载。第一种是通过超链接本
身的特性来下载;第二种是通过代码下载。

注意:
在Idea中,需要在服务器编辑配置->部署->点击+,把外部资源添加到服务器中,资源才能在浏览器中被访问到
在这里插入图片描述

(1)前端的超链接下载

当我们在HTML或JSP页面中使用a标签时,原意是希望能够进行跳转,当遇见浏览器能够直接显示的资源,浏览器就会默认显示出来,比如 txt、png、jpg等。但当超链接遇到浏览器不识别的资源时会自动下载,比如zip压缩包等。当然我们也可以通过download属性规定浏览器进行下载,但有些浏览器并不支持。

默认下载

<!-- 当超链接遇到浏览器不识别的资源时,会自动下载 -- >
<a href="test.zip">超链接下载</a>

指定 download属性下载
download属性可以不写任何信息,会自动使用默认文件名。如果设置了download属性的值,则使用设置的值做为文件名。当用户打开浏览器点击链接的时候就会直接下载文件。

<!-- 当超链接遇到浏览器识别的资源时,默认不会下载。通过download属性可进行下载 -- >
<a href="test.txt" download>超链接下载</a>

(2)后端下载

实现步骤

  1. 需要通过 response.setContentType 方法设置Content-type头字段的值为浏览器无法使用某种方式或激活某个程序来处理的MIME类型,也就是让浏览器无法识别它。例如"application/octet-stream""application/x-msdownload"等。
  2. 设置左下角那个下载框:需要通过响应头 response.setHeader 方法设置Content-Disposition头的值为"attachment;filename=文件名”
  3. 读取下载文件,调用输出流response.getOutputStream方法向客户端写入附件内容。

实例,详解见代码注释

package com.TommyNike.servlet;import javax.servlet. ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java. io. IOException;
import java.io.InputStream;public class Downloadservlet extends HttpServlet {protected void service(HttpServletRequest request, HttpServletResponse response) throws  ServletException, IOException {// 设置两端的编码格式request.setCharacterEncoding("UTF-8");request.setContentType("text/html;charset=UTF-8");// 获取文件下载路径String path = getServletContext().getRealPath("/");//获取要下载的文件名String name = request.getParameter("fileName");if (name == null || "".equals(name .trim())) { //文件名判空response.getWriter().write( s:"请输入要下载的文件名!");response.getWriter().close();return;}//通过路径得到file对象File file = new File(path + name);//判断file对象是否存在,且是否是一个标准文件if (file.exists() && file.isFile()) {// 设置响应类型(浏览器无法使用某种方式或激活某个程序来处理的类型)response.setContentType("application/x-msdownload");// 设置下载文件的名称:nameresponse.setHeader("Content-Disposition", "attachment; filename=" + name);// 得到输入流InputStream is = new FileInputStream(file);// 得到输出流ServletOutputStream os = response.getOutputStream();//定义byte数组byte[] car = new byte[1024];//定义长度int len = 0;// 循环 输出while ((len = is.read(car)) != -1) { // != -1 :不为空os.write(car, 0, len);}// 关闭流 释放资源os.close();is.close();} else {System.out.println("文件不存在,下载失败!");}}
}

以上就是本专栏Servlet板块的全部内容了,欢迎读者在评论区提出意见反馈,博主也很乐于私信交流。下一个板块我们将着重详解Java EE的另一个基石:JSP和JSTL

这篇关于板块一 Servlet编程:第八节 文件上传下载操作 来自【汤米尼克的JavaEE全套教程专栏】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/733018

相关文章

Spring Boot整合Redis注解实现增删改查功能(Redis注解使用)

《SpringBoot整合Redis注解实现增删改查功能(Redis注解使用)》文章介绍了如何使用SpringBoot整合Redis注解实现增删改查功能,包括配置、实体类、Repository、Se... 目录配置Redis连接定义实体类创建Repository接口增删改查操作示例插入数据查询数据删除数据更

Java Lettuce 客户端入门到生产的实现步骤

《JavaLettuce客户端入门到生产的实现步骤》本文主要介绍了JavaLettuce客户端入门到生产的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目录1 安装依赖MavenGradle2 最小化连接示例3 核心特性速览4 生产环境配置建议5 常见问题

Java使用Swing生成一个最大公约数计算器

《Java使用Swing生成一个最大公约数计算器》这篇文章主要为大家详细介绍了Java使用Swing生成一个最大公约数计算器的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下... 目录第一步:利用欧几里得算法计算最大公约数欧几里得算法的证明情形 1:b=0情形 2:b>0完成相关代码第二步:加

Java 的ArrayList集合底层实现与最佳实践

《Java的ArrayList集合底层实现与最佳实践》本文主要介绍了Java的ArrayList集合类的核心概念、底层实现、关键成员变量、初始化机制、容量演变、扩容机制、性能分析、核心方法源码解析、... 目录1. 核心概念与底层实现1.1 ArrayList 的本质1.1.1 底层数据结构JDK 1.7

Java Map排序如何按照值按照键排序

《JavaMap排序如何按照值按照键排序》该文章主要介绍Java中三种Map(HashMap、LinkedHashMap、TreeMap)的默认排序行为及实现按键排序和按值排序的方法,每种方法结合实... 目录一、先理清 3 种 Map 的默认排序行为二、按「键」排序的实现方式1. 方式 1:用 TreeM

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node