Java研学-Servlet3.0文件上传下载

一 文件上传

1 介绍

  用户选择本地文件资源保存到服务器上,Servlet需要将二进制数据以文件保存到服务器磁盘中,再将磁盘路径保存到数据库中

2 项目搭建

  创建web项目,并添加对应jar包(JSTL)

3 API

HttpServletRequest 方法–从请求中解析上传的文件

返回值方法作用
PartgetPart(String name)用于获取请求中指定 name 的文件
CollectiongetParts()获取请求中全部的文件

Part 方法:

返回值方法作用
voidwrite(String fileName)直接把接收到的文件保存到磁盘中
voidgetContentType()获取文件的类型 MIME
StringgetHeader(String name)获取请求头信息
longgetSize()获取文件的大小

  为 Servlet 添加注解 @MultipartConfig 使用 getPart() 获取请求中指定 name 的文件到 Part 对象中,再使用 write 方法保存文件到指定目录

4 例子

① upload.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>用户注册</title>
</head>
<body>
<h3>注册</h3>
<%--enctype="multipart/form-data"表示需要二进制数据--%>
<form action="/fileupload" method="post" enctype="multipart/form-data">
    <span style="color: red">${errorMsg}</span>
    <p>姓名:<input type="text" name="username"></p>
    <p>头像:<input type="file" name="headImg"></p>
    <p><input type="submit" value="提交"></p>
</form>
</body>
</html>

② UploadServlet

@WebServlet("/fileupload")
//文件上传注解 maxFileSize单个上传文件大小 maxRequestSize请求中数据的大小 单位都为bytes
@MultipartConfig(maxFileSize =105560)
public class RegisterServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        try {
            String username = req.getParameter("username");
            //获取表单文件封装的对象
            Part part = req.getPart("headImg");
           //使用工具类实现上传
            String filename = UploadUtil.uploadImg(req, resp, part);
            System.out.println(filename);
        } catch (Exception e) {
            e.printStackTrace();
            //上传的图片大小超过最大值给出提示
            req.setAttribute("errorMsg","上传的图片太大了!");
            req.getRequestDispatcher("register.jsp").forward(req,resp);
            return;
        }
    }
}

③ 工具类

public class UploadUtil {
    public static String uploadImg(HttpServletRequest req, HttpServletResponse resp,
        Part part){
        try {
            //上传文件的类型
            String contentType = part.getContentType();
            if (!contentType.startsWith("image")){
                //上传的不是图片,页面给出提示
                req.setAttribute("errorMsg","上传文件须是图片");
                req.getRequestDispatcher("register.jsp").forward(req,resp);
                return null;
            }
            //获取文件的名称:pic.png
            String fileName = part.getSubmittedFileName();
            //获取源文件类型或后缀名
            String type= fileName.substring(fileName.lastIndexOf("."));
            String s = UUID.randomUUID().toString().replace("-","");//使用uuid生成32位随机字符
            //设置新的文件名称
            String newfilename=s+type;
            //设置上传的目标目录地址
            String path="D:\\java\\upload\\";
            //将上传的文件保存到目标地址
            part.write(path+newfilename);
            return newfilename;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

④ 若想同时上传多张图片可修改 UploadServlet

@WebServlet("/fileupload")
@MultipartConfig(maxFileSize = 80000, maxRequestSize = 140000)
//支持文件上传的注解
@MultipartConfig
public class UploadServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        try {
            //获取表单文件封装的对象集合
            Collection<Part> parts = req.getParts();
            for (Part part : parts) {
                //上传文件的类型
                String contentType = part.getContentType();
                if (contentType != null) { // input 类型是 file
                    // 判断上传的文件类型合法不
                    if(!contentType.startsWith("image/")){
                        req.setAttribute("errorMsg", "请上传图片");
                        req.getRequestDispatcher("/upload.jsp").forward(req,
                                resp);
                        return;
                    }
                //获取文件的名称:cat.png
                String fileName = part.getSubmittedFileName();
                //获取源文件类型或后缀名
                String type= fileName.substring(fileName.lastIndexOf("."));
                String s = UUID.randomUUID().toString().replace("-","");//使用uuid生成32位随机字符
                //设置新的文件名称
                String newfilename=s+type;
                //设置上传的目标目录地址
                String path="D:\\java\\upload\\";
                //将上传的文件保存到目标地址
                part.write(path+newfilename);
            }else { // input 类型非 file
                    System.out.println(req.getParameter(part.getName()));
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            //上传的图片大小超过最大值给出提示
            req.setAttribute("errorMsg","上传的图片太大了!");
            req.getRequestDispatcher("register.jsp").forward(req,resp);
            return;
        }
    }
}

二 文件下载

1 介绍

  下载服务器资源到用户电脑中,服务器文件需放在 WEB-INF中,放在外面用户只需要拿到下载的超链接都能够下载,将文件放在 WEB-INF 下,用户不可以直接访问,须请求到 Servlet 来处理,在对应 service 方法中编写下载限制操作

2 项目搭建

  web 下新建 download 目录,提供两个资源包
  在这里插入图片描述

3 例子

download.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>文件下载</title>
</head>
<body>
<h3>超链接下载当文件在WEB-INF下时无效</h3>
<p><a href="/download/大黄.rar">大黄.rar</a></p>
<p><a href="/download/小黄.rar">小黄.rar</a></p>

<h3>后台servlet下载</h3>
<p><a href="/download?filename=大黄.rar">大黄.rar</a></p>
<p><a href="/download?filename=小黄.rar">小黄.rar</a></p>
</body>
</html>

DownloadServlet

@WebServlet("/download")
public class DownloadServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取文件名称
        String filename = req.getParameter("filename");
        //获取路径
        String path = getServletContext().getRealPath("/WEB-INF/download/");
        //设置中文转码
		//String newfilename = URLEncoder.encode(filename, "utf-8");
		//默认Tomcat 服务器未告知浏览器文件的名称,需手动设置响应头来告知浏览器文件名称
        String newfilename =new String (filename.getBytes("UTF-8"), "ISO-8859-1");
        //设置下载的文件名
        resp.setHeader("content-disposition","attachment;filename="+newfilename);
        //实现文件的下载
        Files.copy(Paths.get(path,filename),resp.getOutputStream());
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/305956.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mysql原理--InnoDB的Buffer Pool

1.缓存的重要性 对于使用 InnoDB 作为存储引擎的表来说&#xff0c;不管是用于存储用户数据的索引&#xff08;包括聚簇索引和二级索引&#xff09;&#xff0c;还是各种系统数据&#xff0c;都是以 页 的形式存放在 表空间 中的&#xff0c;而所谓的 表空间 只不过是 InnoDB 对…

0_项目git地址——正点原子minifly与crazyflie

1、说明&#xff1a; 在每个专栏的第一篇文章&#xff0c;笔者都会贴出项目的git地址&#xff0c;方便后来者学习和复现&#xff1b; 下面介绍两个项目的官网资料和git地址&#xff0c;最后给出两者的对比&#xff1b; 2、正点原子minifly (1)minifly官网资料下载中心&#…

vue element plus Typography 排版

我们对字体进行统一规范&#xff0c;力求在各个操作系统下都有最佳展示效果。 字体# 字号# LevelFont SizeDemoSupplementary text12px Extra SmallBuild with ElementBody (small)13px SmallBuild with ElementBody14px BaseBuild with ElementSmall Title16px MediumBuild w…

Linux信号处理浅析

一、信号从发送到被处理经历的过程 1、常见概念 (1) 信号阻塞 阻塞&#xff0c;即被进程拉黑&#xff0c;信号被发送后&#xff0c;分为两种情况&#xff0c;一种是被阻塞了&#xff08;被拉黑了&#xff09;&#xff0c;一种是没有被阻塞。 (2) 信号未决 在信号被进程处理…

文件夹重命名方法:文件夹名称随机数字命名,提高文件管理效率的秘诀

在数字时代&#xff0c;每天都会创建、接收和存储大量的文件。那如何有效地管理和查找这些文件&#xff1f;下面云炫文件管理器用简单的方法使用随机数字给文件夹命名。掌握方法可以快速识别和分类文件&#xff0c;提高工作效率。 文件夹随机数字命名前后效果图。 文件夹名称…

Tomcat源码解析(一): Tomcat整体架构

Tomcat源码系列文章 Tomcat源码解析(一)&#xff1a; Tomcat整体架构 目录 一、Tomcat整体架构1、Tomcat两个核心组件功能2、Tomcat支持的多种I/O模型和应用层协议 二、Connector连接器1、连接器功能汇总2、ProtocolHandler组件2.1、Endpoint2.2、Processor 3、Adapter组件 三…

向量数据库:Milvus

特性 Milvus由Go(63.4%),Python(17.0%),C(16.6%),Shell(1.3%)等语言开发开发&#xff0c;支持python&#xff0c;go&#xff0c;java接口(C,Rust,c#等语言还在开发中)&#xff0c;支持单机、集群部署&#xff0c;支持CPU、GPU运算。Milvus 中的所有搜索和查询操作都在内存中执行…

stable diffusion 人物高级提示词(二)衣物、身材

一、衣服大类 英文中文Shirt衬衫Blouse女式衬衫Dress连衣裙Skirt裙子Pants裤子Jeans牛仔裤Swimsuit泳衣Underwear内衣Bra文胸Panties内裤Stockings长筒袜Shoes鞋子Socks袜子 二、细分分类 dress 是连衣裙&#xff1a; 英文解释Formal Dress正式礼服&#xff0c;通常用于正式…

C# 一看就懂的装箱拆箱案例

文章目录 装箱&#xff08;Boxing&#xff09;拆箱&#xff08;Unboxing&#xff09;编程语言中的装箱与拆箱优缺点 在C#中&#xff0c;装箱&#xff08;Boxing&#xff09;和拆箱&#xff08;Unboxing&#xff09;是值类型与引用类型之间相互转换的过程。 装箱&#xff08;Box…

Maven之属性管理

1.属性管理 1.1 属性配置与使用 ①&#xff1a;定义属性 <!--定义自定义属性--> <properties><spring.version>5.2.10.RELEASE</spring.version> </properties>②&#xff1a;引用属性 <dependency><groupId>org.springframewor…

OBD汽车

相当于客户端与服务器 诊断设备流程 》》》》诊断服务 OBD很多的定死了 Vme就很灵活 WWH 就是两个的结合 OBD15031 SID PID 可以自己定义一些 一个字节255个 两个有效字节 02 01 0D 5555&#xff08;随机值&#xff09;这是请求 两个有效字节 01 OD&#xff08;请求速…

flex布局(2)

五、优缺点 优点&#xff1a; 简单易用&#xff1a;Flex布局使用简单&#xff0c;只需通过设置容器的属性即可实现弹性布局&#xff0c;无需复杂的计算和调整。自适应性&#xff1a;Flex布局可以根据容器的大小自动调整元素的位置和大小&#xff0c;适应不同的屏幕尺寸和设备…

通用机V8R6集群部署_1主1备1见证_图形化_Centos7

KingbaseES 提供数据库部署工具进行数据库集群的部署。KingbaseES 提供基于图形化和命令行操作的集群部署方式&#xff0c;本文档主要用于指导不支持 GUI 的服务器上的 KingbaseES 集群部署工作。 集群简介 KingbaseES软件能够提供一主一备以及一主多备的高可用集群架构&…

Linux系统下gitee使用git提交代码

Linux系统下gitee使用git提交代码 一、安装配置git1.1 在 Linux 中安装 git&#xff0c;并生成授信证书1.2 将SSH key 添加到 ssh-agent1.2 将SSH key 添加到你的gitee账户 二、gitee 的使用2.1 下载项目到本地 三、上传gitee三步走3.1 三板斧第一招&#xff1a;git add3.2 三板…

C++ 开发 + VSCode 调试

C 开发 VSCode 调试 MSYS2 安装 gcc、make下载安装MSMYS2pacman 添加镜像源 GCC1. 安装2. 查看结果3. 环境变量 GDB VSCode 调试所需插件创建项目调试代码1. tasks.json 配置任务2. launch.json 配置调试3. 运行 更进一步的 C/C 设置 参考资料 MSYS2 安装 gcc、make 下载 官…

Java网络爬虫--HttpClient

目录标题 技术介绍有什么优点&#xff1f;怎么在项目中引入&#xff1f; 请求URLEntityUtils 类GET请求带参数的GET请求POST请求 总结 技术介绍 HttpClient 是 Apache Jakarta Common 下的子项目&#xff0c;用来提供高效的、功能丰富的、支持 HTTP 协议的客户端编程工具包。相…

Pycharm中如何配置python环境(conda)

首先在pycharm中点击 "File" > "Settings" 再次点击如下操作&#xff1a; 点击Python Interpreter的最右侧按钮&#xff0c;点击Show All... 找到python文件 最后点击OK

ros gazebo机械臂仿真,手动控制与MoveIt自动控制

本文总结归纳古月居胡春旭ros机械臂教程&#xff0c;给出了一些error的解决方法&#xff0c;补充了通过python运行moveit。十分建议去看github huchunxu源代码的repository。 创建机械臂的xacro模型 首先创建一个工作空间&#xff0c;在工作空间中创建arm_description功能包。…

Qt应用-实现图像截取功能类似QQ上传头像截取功能

本文演示利用Qt实现图像截取功能类似QQ上传头像截取功能。 效果如下,通过移动中间的裁剪区域可以获得一张裁剪后的图片。 目录

MySQL进阶之(二)索引的数据结构

二、索引的数据结构 2.1 关于索引2.1.1 什么是索引&#xff1f;2.1.2 为什么使用索引&#xff1f;2.1.3 索引的优缺点01、优点02、缺点 2.1.4 一个简单的索引设计方案 2.2 InnoDB 中的索引设计2.2.1 迭代①&#xff1a;目录项记录的页2.2.2 迭代②&#xff1a;多个目录项记录的…