springmvc实现文件上传与下载【单张及多张图片】

2023-05-16

一、springmvc实现文件上传的步骤

1、实现上传单张图片

1、导入pom 坐标

<!--文件上传-->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.3</version>
</dependency>
<!--servlet-api导入高版本的-->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.0.1</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>

2、编写上传页面

注意:页面上通过 input 来准备 file 组件,该标签必须给定 name 属性值(该 name 不能和实体类的属性名一致),要求 form 表单必须给定一个属性:enctype=“multipart/form-data”,同时请求必须为post:method=“post”

<h2>文件上传</h2>
<form action="up" method="post" enctype="multipart/form-data" >
    用户名:<input  type="text" name="name" value="jim" /><br/>
    头像:<input  type="file" name="myfile" /><br/>
    <input type="submit" value="上传" />
</form>

在这里插入图片描述

3、文件上传配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation=" http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">

    <!--自动扫描包,让指定包下的注解生效,有IOC容器统一管理-->
    <context:component-scan base-package="com.kuang.controller"/>

    <!--让springmvc 不处理静态资源-->
    <mvc:default-servlet-handler/>

    <!--开启注解支持-->
    <mvc:annotation-driven>
        <!--json乱码问题配置-->
        <mvc:message-converters>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <constructor-arg value="UTF-8"/>
            </bean>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="objectMapper">
                    <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                        <property name="failOnEmptyBeans" value="false"/>
                    </bean>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

    <!--配置视图解析器-->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--前缀解析器-->
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <!--后缀解析器-->
        <property name="suffix" value=".jsp"></property>
    </bean>

    <!--文件上传配置-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 请求的编码格式,必须和jSP的pageEncoding属性一致,以便正确读取表单的内容,默认为ISO-8859-1 -->
        <property name="defaultEncoding" value="utf-8"/>
        <!-- 上传文件大小上限,单位为字节(10485760=10M) -->
        <property name="maxUploadSize" value="10485760"/>
        <property name="maxInMemorySize" value="40960"/>
    </bean>

</beans>

4、编写Controller类

@RequestMapping("/up")
public String testUP(@RequestParam CommonsMultipartFile myfile, String name, Model m, HttpSession session) throws Exception{

    String realpath = session.getServletContext().getRealPath("\\upload");
    System.out.println("上传文件保存地址:"+realpath);

    // 获取客户端文件名  hello.jpg 3.jpg
    String fname = myfile.getOriginalFilename();
    // 以 . 进行分割并截取后面的
    String ftype =  fname.substring(fname.lastIndexOf("."));
    // 生产的不重复的文件名
    String filename = UUID.randomUUID().toString();
    // 文件名+文件类型
    String fullname = realpath+"\\"+filename+ftype;
    System.out.println("上传的文件名:"+fname);

    // 将上传文件的内容 转成 byte数组
    byte[] b = myfile.getBytes();
    //将上传的文件输出到磁盘
    System.out.println(fullname);
    
    FileOutputStream out = new FileOutputStream(fullname);
    out.write(b);
    out.flush();
    out.close();
    
    m.addAttribute("fname", fname);
    return "ok";
}

5、上传成功后跳转的页面

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<%
String fname =  (String)request.getAttribute("fname");
%>
<h3>成功上传了一个文件 <%= fname %></h3>
</body>
</html>

效果图:

在这里插入图片描述

2、实现上传多张图片

1、编写上传页面

<h2>文件上传多张图片</h2>
<form action="up2" method="post" enctype="multipart/form-data" >
    用户名:<input  type="text" name="name" value="jim" /><br/>
    文件1:<input  type="file" name="myfile" /><br/>
    文件2:<input  type="file" name="myfile" /><br/>
    <input type="submit" value="上传" />
</form>

在这里插入图片描述

2、编写Controller类

@RequestMapping("/up2")
public String testUP2(@RequestParam CommonsMultipartFile[] myfile, String name, Model m, HttpSession session) throws Exception{

    // 用于存放客户端上传的文件名
    ArrayList listname =new ArrayList();
    // 用于存放服务器端上传的文件名
    ArrayList listname2 =new ArrayList();
    // File.separator 不同系统的分隔符
    String realpath = session.getServletContext().getRealPath(File.separator+"upload");
    System.out.println("上传文件保存地址:"+realpath);

    for(CommonsMultipartFile cf :myfile){
        // 获取客户端文件名  hello.jpg 3.jpg
        String fname = cf.getOriginalFilename();
        // 以 . 进行分割并截取后面的
        String ftype =  fname.substring(fname.lastIndexOf("."));
        // 生产的不重复的文件名
        String filename = UUID.randomUUID().toString();
        // 文件名+文件类型
        String fullname = realpath+File.separator+filename+ftype;
        System.out.println(fname);
        //将上传的文件输出到磁盘
        System.out.println(fullname);
        // 将文件内容输出到指定位置
        cf.transferTo(new File(fullname));
        listname.add(fname);
        listname2.add(filename+ftype);
        m.addAttribute("flist", listname);
        m.addAttribute("flist2", listname2);
    }
    return "ok2";
}

3、上传成功后跳转的页面

<%@ page contentType="text/html;charset=UTF-8" import="java.util.*" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    ArrayList flist =  (ArrayList)request.getAttribute("flist");
    ArrayList flist2 =  (ArrayList)request.getAttribute("flist2");
%>
<h3>成功上传了
    <%
        for(int i = 0 ; i < flist.size() ;i++){
            String n = (String)flist.get(i);
    %>
    <%=n %>,
    <%
        }
    %>文件 </h3>
<hr/>
<%
    for(int i = 0 ; i < flist2.size() ;i++){
        String name = (String)flist2.get(i);
%>
<img alt="图片加载失败" title="上传的图片" src="<%=request.getContextPath()%>/upload/<%=name%>" />
<%
    }
%>

</body>
</html>

在这里插入图片描述

二、springmvc实现文件下载的步骤

1、显示所有下载图片

这里我们先显示文件夹中所有的图片,然后在点击单个图片进行下载。

<h2><a href="xzview" >下载页面</a></h2>

2、编写Controller 类

//下载图片前  显示列表
@RequestMapping("/xzview")
public String testXzView(Model m, HttpSession session){
    String realpath = session.getServletContext().getRealPath(File.separator+"upload");
    File f = new File(realpath);
    String[] fs = f.list(); //文件夹中所有的文件名
    m.addAttribute("fs", fs);
    return "view";
}

//下载图片
@RequestMapping("/xzimgcon")
public void xzimgcon(String fname , HttpServletRequest request, HttpServletResponse response){
    response.setContentType("image/jpeg;charset=utf-8");// 服务端以 二进制流的形式 相应客户端

    //String spath = request.getSession().getServletContext().getRealPath("img\\");
    HttpSession session = request.getSession(); //获取session对象
    ServletContext sc =  session.getServletContext(); //获取ServletContext对象  Servlet上下文对象
    String realpath = sc.getRealPath("upload\\");
    //System.out.println(realpath);
    //String filename = "1";
    response.setHeader("Content-disposition", "attachment;filename=" + fname);
    try {
        //构建输入流,将磁盘上的文件 读取到程序中
        FileInputStream fin = new FileInputStream(realpath + "\\" + fname);
        //输出流由response提供,将程序中的字节 输出到 客户端
        ServletOutputStream fout = response.getOutputStream();
        byte[] b = new byte[fin.available()];
        fin.read(b);fout.write(b);fin.close();fout.flush();fout.close();
    } catch (Exception e) {
        System.out.println("下载文件出现异常");
        e.printStackTrace();
    }
}

3、实现下载页面

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<h1>下载页面</h1>
<%
String[] fs =  (String[])request.getAttribute("fs");
%>
<%
for(int i = 0 ; i < fs.length; i++){
	  String fname =  fs[i];
	  %>
	  <img width="100" height="100" src="<%=request.getContextPath()+"/upload/"+fname %>" /><a href="xzimgcon?fname=<%=fname%>">下载</a>
	  <%
}
%>
</body>
</html>

效果图:

在这里插入图片描述


如果有收获!!! 希望老铁们来个三连,点赞、收藏、转发。
创作不易,别忘点个赞,可以让更多的人看到这篇文章,顺便鼓励我写出更好的博客
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

springmvc实现文件上传与下载【单张及多张图片】 的相关文章

  • 为什么要写博客

    为什么要写博客 xff1f 我相信很多小伙伴和我有一样的疑惑 最近我也常和身边的朋友说写写博客做总结 xff0c 因为有的时候面试官遇到技术还不错的面试者会问你有没有博客 xff0c 如果有的话会在面试的时候额外加分 据我观察几乎每一个程序
  • hexo搭建博客【详细步骤】适合初学者

    为什么要搭建自己的博客 xff1a https blog csdn net weixin 45606067 article details 107966915 下面说一下如何从零开始上手搭建博客 Hexo搭建博客步骤 xff1a 搭建博客需
  • SpringBoot(一)概述、HelloWord案例

    1 SpringBoot 简介 回顾什么是Spring Spring是一个开源框架 xff0c 2003 年兴起的一个轻量级的Java 开发框架 Spring是为了解决企业级应用开发的复杂性而创建的 xff0c 简化开发 Spring是如何
  • PyTorch:view() 与 reshape() 区别详解

    总之 xff0c 两者都是用来重塑tensor的shape的 view只适合对满足连续性条件 xff08 contiguous xff09 的tensor进行操作 xff0c 而reshape同时还可以对不满足连续性条件的tensor进行操
  • SpringBoot(二)运行原理探究

    我们之前写的HelloSpringBoot xff0c 到底是怎么运行的呢 xff0c Maven项目 xff0c 我们一般从 pom xml文件探究起 SpringBoot2 3 3版本的官网文档说明 xff1a https docs s
  • idea查看源码时总是出现 .class而不是 .java源码

    步骤 1 File gt Settings gt Maven gt importing xff08 勾选上 Sources 和 Documentation xff09 2 右键项目的pom xml gt Maven gt Reimport
  • SpringBoot(三)yaml配置注入

    配置文件 SpringBoot使用一个全局的配置文件 xff0c 配置文件名称是固定的 application properties 语法结构 xff1a key 61 value application yml 语法结构 xff1a ke
  • SpringBoot(四)JSR303数据校验及多环境切换

    1 JSR303数据校验 先看看如何使用 Springboot 中可以用 64 validated 来校验数据 xff0c 如果数据异常则会统一抛出异常 xff0c 方便异常中心统一处理 我们这里来写个注解让我们的 name 只能支持 Em
  • SpringBoot(五)自动配置原理

    1 配置文件到底能写什么 xff1f 怎么写 xff1f SpringBoot 官网有大量的配置说明 xff0c 我们是无法全部记住的 xff1b SpringBoot 2 3 3 官网文档 2 分析自动配置原理 这里我们以 HttpEnc
  • SpringBoot(六)日志处理

    1 日志框架 简单分析案例 xff1a 小张 xff1b 开发一个大型系统 xff1b 1 System out println 34 34 xff1b 将关键数据打印在控制台 xff1b 去掉 xff1f 写在一个文件 xff1f 2 框
  • SpringBoot(七)Web开发静态资源处理

    1 静态资源处理 静态资源映射规则 首先 xff0c 我们搭建一个普通的 SpringBoot 项目 xff0c 回顾一下HelloWorld程序 xff01 写请求非常简单 xff0c 那我们要引入我们前端资源 xff0c 我们项目中有许
  • SpringBoot(八)Thymeleaf模板引擎

    模板引擎 前端交给我们的页面 xff0c 是 html 页面 如果是我们以前开发 xff0c 我们需要把他们转成 jsp 页面 xff0c jsp 好处就是当我们查出一些数据转发到JSP页面以后 xff0c 我们可以用jsp轻松实现数据的显
  • SpringBoot(九)MVC自动配置原理【深入源码】

    官网阅读 在进行项目编写前 xff0c 我们还需要知道一个东西 xff0c 就是 SpringBoot 对我们的 SpringMVC 还做了哪些配置 xff0c 包括如何扩展 xff0c 如何定制 只有把这些都搞清楚了 xff0c 我们在之
  • SpringBoot(十)RestfulCRUD

    我们先创建一个SpringBoot的 web 项目 xff0c 并导入thymeleaf lombok 坐标 1 环境搭建 首先我们先将静态资源及页面拷入到项目中 然后我们编写 pojo dao类 这里我们没有连接数据库 xff0c Dao
  • PyTorch:torch.sum

    torch sum 函数定义 xff1a torch sum input dim keepdim 61 False dtype 61 None Tensor 作用 xff1a 返回输入tensor的指定维度dim上的和 参数keepdim表
  • SpringBoot(十一)国际化

    有的时候 xff0c 我们的网站会去涉及中英文甚至多语言的切换 xff0c 这时候我们就需要学习国际化了 xff01 准备工作 先在IDEA中统一设置 properties 的编码问题 xff01 编写国际化配置文件 xff0c 抽取页面需
  • SpringBoot(十二)整合JDBC

    SpringData简介 对于数据访问层 xff0c 无论是 SQL 关系型数据库 还是 NOSQL 非关系型数据库 xff0c Spring Boot 底层都是采用 Spring Data 的方式进行统一处理 Spring Boot 底层
  • SpringBoot(十三)整合Druid

    Druid简介 Java程序很大一部分要操作数据库 xff0c 为了提高性能操作数据库的时候 xff0c 又不得不使用数据库连接池 Druid 是阿里巴巴开源平台上一个数据库连接池实现 xff0c 结合了 C3P0 DBCP 等 DB 池的
  • SpringBoot(十四)整合MyBatis

    官方文档 xff1a http mybatis org spring boot starter mybatis spring boot autoconfigure Maven仓库地址 xff1a https mvnrepository co
  • SpringBoot(十五)集成SpringSecurity

    安全简介 在 Web 开发中 xff0c 安全一直是非常重要的一个方面 安全虽然属于应用的非功能性需求 xff0c 但是应该在应用开发的初期就考虑进来 如果在应用开发的后期才考虑安全的问题 xff0c 就可能陷入一个两难的境地 xff1a

随机推荐

  • SpringBoot(十七)集成Swagger

    Swagger简介 前后端分离 前端 gt 前端控制层 视图层后端 gt 后端控制层 服务层 数据访问层前后端通过API进行交互前后端相对独立且松耦合 产生的问题 前后端集成 xff0c 前端或者后端无法做到 及时协商 xff0c 尽早解决
  • SpringBoot(十六)集成Shiro

    1 Shiro简介 什么是Shiro xff1f Apache Shiro 是一个Java的安全 xff08 权限 xff09 框架 Shiro 可以非常容易的 xff0c 开发出足够好的应用 xff0c 其不仅可以用在Java环境 xff
  • SpringBoot(十八)异步、定时、邮件任务

    异步任务 异步处理还是非常常用的 xff0c 比如我们在网站上发送邮件 xff0c 后台会去发送邮件 xff0c 此时前台会造成响应不动 xff0c 直到邮件发送完毕 xff0c 响应才会成功 xff0c 所以我们一般会采用多线程的方式去处
  • SpringBoot(二十)集成Dubbo和Zookeeper

    分布式理论 什么是分布式系统 xff1f 在 分布式系统原理与范型 一书中有如下定义 xff1a 分布式系统是若干独立计算机的集合 xff0c 这些计算机对于用户来说就像单个相关系统 xff1b 分布式系统是由一组通过网络进行通信 为了完成
  • SpringBoot(十九)集成Redis

    SpringBoot 集成 Redis 主要就是使用 RedisTemplate 类来进行各种操作 可以很多人没有注意到 xff0c 在 SpringBoot 2 x 之后 xff0c 底层访问redis 已经不再使用 jedis xff0
  • PyTorch:torch.linspace

    函数定义 xff1a torch linspace start end steps 61 100 out 61 None dtype 61 None layout 61 torch strided device 61 None requir
  • 面向对象(1/3)类和对象

    文章目录 面向过程 xff08 POP xff09 与面向对象 xff08 OOP xff09 类和对象 xff08 面向对象的两大要素 xff09 几个概念的使用说明类和对象的使用类的语法格式对象的创建和使用类的访问机制对象的分析 1 属
  • 面向对象(2/3)封装性、继承性、多态性

    文章目录 一 面向对象特征一 xff1a 封装性封装和隐藏权限修饰符类的成员之三 xff1a 构造器属性赋值的先后顺序JavaBeanthis关键字的使用package关键字的使用MVC设计模式import关键字的使用Eclipse中的快捷
  • Git实用命令大全(附思维导图)

    一 平时我们经常用的命令 1 基础命令 span class token comment 初始化 span span class token function git span init span class token comment 将
  • 面向对象(3/3)抽象类,接口、内部类、代码块

    文章目录 1 java lang Object1 61 61 和equals 的使用2 equals 方法的重写3 toString 的使用 2 JUnit单元测试的使用3 包装类面试题 4 static关键字的使用5 设计模式单例设计模式
  • 常用类String、时间日期类

    文章目录 1 String1 xff09 String内存解析2 xff09 String的使用3 xff09 String实例化4 xff09 图解两种创建字符串方式的区别5 xff09 图解字符串的存储6 xff09 图解字符串对象的存
  • 图书馆管理系统【SSM含SQL文件】

    项目源代码 https gitee com StarSea007 mylibrary ssm 编译环境 jdk 1 8mysql 5 0 及以上tomcat 8 框架 Spring 43 SpringMvc 43 Mybatis jar包管
  • Servlet及相关接口 【最全总结】

    1 Servlet 简介 1 xff09 从广义上来讲 xff0c Servlet 规范是 Sun 公司制定的一套技术标准 xff0c 包含与 Web 应用相关的一系列接口 xff0c 是 Web 应用实现方式的宏观解决方案 而具体的 Se
  • springmvc请求参数绑定 | 中文乱码 | 自定义类型转换器

    1 绑定的机制 表单中请求参数都是基于 key 61 value 的 SpringMVC 绑定请求参数的过程是通过把表单提交请求参数 xff0c 作为控制器中方法参数进行绑的 例如 xff1a span class token operat
  • 转发与重定向【面试题】

    请求转发与重定向 请求转发和重定向是 web 应用页面跳转的主要手段 xff0c 应用十分广泛 xff0c 所以我们一定要搞清楚他们的区别 1 请求转发 1 xff09 第一个 Servlet 接收到了浏览器端的请求 xff0c 进行了一定
  • 路径问题:相对路径与绝对路径

    1 提出问题 创建 Web 应用 Path xff0c 目录结构如图所示 在 a html 中有超链接 lt a href 61 34 b html 34 gt To b html lt a gt 如果先直接访问 a html xff0c
  • PyTorch:torch.Tensor.repeat()、expand()

    目录 1 torch Tensor repeat 2 torch Tensor expand 1 torch Tensor repeat 函数定义 xff1a repeat sizes Tensor 作用 xff1a 在指定的维度上重复这个
  • Cookie学习笔记

    1 cookie 简介 1 1 什么是 cookie cookie xff0c 有时我们也用其复数形式 cookies xff0c 是服务端保存在浏览器端的数据片段 以 key value 的形式进行保存 每次请求的时候 xff0c 请求头
  • mybatis中关于example类详解

    一 什么是example类 mybatis generator会为每个字段产生如上的Criterion xff0c 如果表的字段比较多 产生的Example类会十分庞大 理论上通过example类可以构造你想到的任何筛选条件 在mybati
  • springmvc实现文件上传与下载【单张及多张图片】

    一 springmvc实现文件上传的步骤 1 实现上传单张图片 1 导入pom 坐标 span class token comment lt 文件上传 gt span span class token tag span class toke