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

news2024/11/24 22:25:25

一 文件上传

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());
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mysql使用load data导入数据

windows环境&#xff0c;使用bat脚本sql脚本 bat脚本 echo off ::调用数据入库sql脚本 set hour%time:~0,2% if "%time:~0,1%"" " set hour0%time:~1,1% set now%Date:~0,4%%Date:~5,2%%Date:~8,2%%hour%%Time:~3,2%%Time:~6,2% echo %now% ::数据库地址…

【Python机器学习】朴素贝叶斯分类器

朴素贝叶斯分类器是与线性模型非常相似的一种分类器&#xff0c;它的训练速度往往更快&#xff0c;但是泛化能力比线性分类器稍差。 朴素贝叶斯分类器高效的原因是&#xff1a;通过单独查看每个特征来学习参数&#xff0c;并从每个特征中收集简单的类别统计数据。 scikit-lea…

C盘突然满了,怎么清理

方法一 winr 输入%tem%按回车键&#xff0c;出现的这些都是缓存文件可以按删除键删掉 方法二 winr 输入cleanmgr按回车键&#xff0c;选择清理的盘符&#xff0c;这里选择C盘&#xff0c;点击确定删除 方法三 在系统设置里手动删除 找到电脑里面的设置选项&#xff0c;找…

径向基函数插值

一、径向基函数的定义 如果 ∣ ∣ x 1 ∣ ∣ ∣ ∣ x 2 ∣ ∣ ||x_1||||x_2|| ∣∣x1​∣∣∣∣x2​∣∣&#xff0c;那么 ϕ ( x 1 ) ϕ ( x 2 ) \phi(x_1)\phi(x_2) ϕ(x1​)ϕ(x2​) 的函数 ϕ \phi ϕ 就是径向函数&#xff0c;即仅由 r ∣ ∣ x ∣ ∣ r||x|| r∣∣…

汽车雷达:实时SAR成像的实现

摘要: 众所周知,点云成像是目前实现汽车雷达感知最流行的方案,尤其是采用多级联实现的4D点云成像雷达,这是目前最有希望实现产品落地的技术方案之一。 今天重点分享关于汽车雷达SAR成像相关技术内容,这也证实了4D点云成像雷达并不一定就是汽车雷达成像唯一的方案,在业内…

Pytorch常用的函数(六)常见的归一化总结(BatchNorm/LayerNorm/InsNorm/GroupNorm)

Pytorch常用的函数(六)常见的归一化总结(BatchNorm/LayerNorm/InsNorm/GroupNorm) 常见的归一化操作有&#xff1a;批量归一化&#xff08;Batch Normalization&#xff09;、层归一化&#xff08;Layer Normalization&#xff09;、实例归一化&#xff08;Instance Normaliza…

【Linux驱动】Pinctrl子系统 | GPIO子系统 | 基于子系统的LED驱动程序

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《Linux驱动》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 &#x1f6f7;Pinctrl子系统&#x1f945;设备树中的Pinctrl子系统 &#x1f6f7;GPIO子系统…

ComfyUI报错AttributeError: module ‘cv2.gapi.wip.draw‘ has no attribute ‘Text‘

ComfyUI在安装comfyui-reactor-node插件,然后启动之后突然报错: AttributeError: module cv2.gapi.wip.draw has no attribute Text 这是怎么回事呢? 于是四处搜寻答案。 总之就是opencv-python版本的问题导致的。 我将有可能解决办法的方法进行了总结。 下面列出所有解…

强化学习的数学原理学习笔记 - 时序差分学习(Temporal Difference)

文章目录 概览&#xff1a;RL方法分类时序差分学习&#xff08;Temporal Difference&#xff0c;TD&#xff09;TD for state values&#x1f7e6;Basic TD&#x1f7e1;TD vs. MC &#x1f7e6;Sarsa (TD for action values)Basic Sarsa变体1&#xff1a;Expected Sarsa变体2&…

动态SLAM 开源方案汇总及介绍(一)

参考https://zhuanlan.zhihu.com/p/673614739及https://zhuanlan.zhihu.com/p/673615788 具体来说&#xff0c;当SLAM系统在前一帧的动态物体上提取了特征点时&#xff0c;如果将这个特征点投影到当前帧&#xff0c;由于目标已经移动&#xff0c;这个点找到的匹配点必然是错误…

【python】爬取知乎热榜Top50保存到Excel文件中【附源码】

欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 一、导入必要的模块&#xff1a; 这篇博客将介绍如何使用Python编写一个爬虫程序&#xff0c;从斗鱼直播网站上获取图片信息并保存到本地。我们将使用requests模块发送HTTP请求和接收响应&#xff0c;以及os模块处理文件…

MySQL 8.0 InnoDB Tablespaces之Temporary Tablespaces(临时表空间)

文章目录 MySQL 8.0 InnoDB Tablespaces之Temporary Tablespaces&#xff08;临时表空间&#xff09;会话临时表空间会话临时表空间的磁盘分配和回收会话临时表空间的创建创建临时表和查看临时表信息会话临时表空间相关的设置参数innodb_temp_tablespaces_dir 全局临时表空间查…

「MCU」SD NAND芯片之国产新选择优秀

文章目录 前言 传统SD卡和可贴片SD卡 传统SD卡 可贴片SD卡 实际使用 总结 前言 随着目前时代的快速发展&#xff0c;即使是使用MCU的项目上也经常有大数据存储的需求。可以看到经常有小伙伴这样提问&#xff1a; 大家好&#xff0c;请问有没有SD卡芯片&#xff0c;可以…

RT-Thread 线程管理

线程管理 在日常生活中&#xff0c;我们要完成一个大任务&#xff0c;一般会将它分解成多个简单、容易解决的小问题&#xff0c;小问题逐个被解决&#xff0c;大问题也就随之解决了。 在多线程操作系统中&#xff0c;也同样需要开发人员把一个复杂的应用分解成多个小的、可调…

C#上位机与三菱PLC的通信01--搭建仿真环境

1、三菱PLC介绍 三菱PLC是三菱电机生产的主力产品。 它采用一类可编程的存储器&#xff0c;用于其内部存储程序&#xff0c;执行逻辑运算、顺序控制、定时、计数与算术操作等面向用户的指令&#xff0c;并通过数字或模拟式输入/输出控制各种类型的机械或生产过程。三菱PLC在中国…

软件测试|深入理解Python的encode()和decode()方法

简介 在Python中&#xff0c;字符串是不可变的序列对象&#xff0c;它由Unicode字符组成。当我们需要在字符串和字节之间进行转换时&#xff0c;Python提供了两个非常重要的方法&#xff1a;encode()和decode()。这两个方法允许我们在Unicode字符和字节之间进行相互转换&#…

网络报文分析程序的设计与实现(2024)

1.题目描述 在上一题的基础上&#xff0c;参照教材中各层报文的头部结构&#xff0c;结合使用 wireshark 软件&#xff08;下载地址 https://www.wireshark.org/download.html#releases&#xff09;观察网络各层报文捕获&#xff0c;解析和分析的过程&#xff08;如下 图所示&a…

计算机毕业设计——SpringBoot 个人博客管理系统(附源码)

1&#xff0c;绪论 1.1 背景调研 在互联网飞速发展的今天&#xff0c;互联网已经成为人们快速获取、发布和传递信息的重要渠道&#xff0c;它在人们政治、经济、生活等各个方面发挥着重要的作用。互联网上发布信息主要是通过网站来实现的&#xff0c;获取信息也是要在互联网中…

智能网联汽车安全相关标准汇总

目录 1.标准方向分析 2.智能驾驶域相关标准 3.智能座舱域相关标准 3.汽车通用规范 1.标准方向分析 当前汽车行业的内卷态势已经蔓延至项目立项&#xff0c;导致如今开发模式都尽可能地左移&#xff0c;例如瑞萨提出的虚拟ECU开发模式可以极大节省ECU的实车验证资源&#xf…

Open3D 基于统计滤波去除噪点(5)

Open3D 基于统计滤波去除噪点&#xff08;5&#xff09; 一、什么是统计滤波二、具体实现1.代码 一、什么是统计滤波 统计滤波是一种常用的点云滤波方法&#xff0c;用于去除噪声和异常点。在统计滤波中&#xff0c;通过计算每个点邻域内的统计特征&#xff08;如平均值和标准…