SpringMVC文件上传、下载、国际化配置

news2025/1/14 1:25:15

Java知识点总结:想看的可以从这里进入

目录

      • 3.6、文件上传、下载
        • 3.6.1、文件上传
        • 3.6.2、文件下载
      • 3.7、国际化配置

3.6、文件上传、下载

3.6.1、文件上传

form 表单想要具有文件上传功能,其必须满足以下 3 个条件。

  • form 表单的 method 属性必须设置为 post。
  • form 表单的 enctype 属性设置为 multipart/form-data。
  • 至少提供一个 type 属性为 file 的 input 输入框。

在SpringMVC 中为我们提供了文件解析器,来实现上传文件的功能,MultipartResolver 本身是一个接口,我们需要通过它的实现类来完成对它的实例化工作。

实现类说明依赖支持的 Servlet 版本
StandardServletMultipartResolverServlet 内置的上传功能。不需要第三方 JAR 包的支持。仅支持 Servlet 3.0 及以上版本
CommonsMultipartResolver借助 Apache 的 commons-fileupload 来完成具体的上传操作。需要 Apache 的 commons-fileupload 等 JAR 包的支持。不仅支持 Servlet 3.0 及以上版本,还可以在比较旧的 Servlet 版本中使用。
<!-- CommonsMultipartResolver依赖 支持文件上传(注意此组件在Spring6被移除了)-->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.1</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.8.0</version>
</dependency>

CommonsMultipartResolver我们在学习Servlet组件的时候使用过,它在springMVC中使用时需要配置文件解析器,其中multipartResolver这个名字是固定的一旦更改,就无法完成文件的解析和上传工作。

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!--编码格式 -->
    <property name="defaultEncoding" value="UTF-8"/>
    <!--上传文件大小-->
    <property name="maxUploadSize" value="103424"/>
    <!-- <property name="maxUploadSizePerFile" value="102400"/>-->
    <property name="resolveLazily" value="true"/>
</bean>

在使用时直接向Controller的方法中传入参数即可 MultipartFile file即可使用:

@RequestMapping("")
public void multipartFileTest(MultipartFile file){

}
内部方法作用
byte[] getBytes()以字节数组的形式返回文件的内容。
String getContentType()返回文件的内容类型。
InputStream getInputStream()返回一个 input 流,从中读取文件的内容。
String getName()返回请求参数的名称。
String getOriginalFillename()返回客户端提交的原始文件名称。
long getSize()返回文件的大小,单位为字节。
boolean isEmpty()判断被上传文件是否为空。
void transferTo(File destination)将上传文件保存到目标目录下。
<form th:action="@{/student}" method="post" enctype="multipart/form-data">
    <table style="margin: auto">
        <tr>
            <td>照片:</td>
            <td><input type="file" id="chooseImage" name="photos" multiple="multiple" required><br>
                <span id="img-div"></span></td>
        </tr>
        <tr>
            <td colspan="2" align="center">
                <input type="submit" value="提交">
                <input type="reset" value="重置">
            </td>
        </tr>
    </table>
    <!-- 保存用户自定义的背景图片 -->
    <img id="preview_photo" src="" width="200px" height="200px">
</form>

使用Controller上传图片

@RequestMapping(value = "/uploadPhoto", method = RequestMethod.POST)
public String uploadPhoto(MultipartFile photo, HttpServletRequest request,Model model) {
    String realPath = request.getSession().getServletContext().getRealPath("/upload/");
    System.out.println(realPath);
    File fileDir = new File(realPath);
    if (!fileDir.exists()) {
        fileDir.mkdir();
    }
    String filename = photo.getOriginalFilename();
    System.err.println("正在上传的图片为:" + filename);
    String newFileName = UUID.randomUUID() + filename;
    try {
        //将文件保存指定目录
        photo.transferTo(new File(realPath + newFileName));
        model.addAttribute("message","上传成功");
        model.addAttribute("filename",newFileName);
    } catch (Exception e) {
        model.addAttribute("message","上传失败");
        e.printStackTrace();
    }

    return "page/success";
}
<h1 th:text="${message}"></h1>
<table>
    <tr>
        <td>照片:</td>
        <td th:if="${message}eq'上传成功'">
            <img th:src="@{'http://localhost:8080/upload/'+${filename}}" width='200px' height='200px'/><br>
        </td>
    </tr>
</table>

image-20220917171145599

image-20220917171154976

这里有一点要注意,如果使用的eclipse,那么使用request.getSession().getServletContext().getRealPath(“/upload/”),获取的就是部署到Tomcat的路径,可以直接获取,但是如果你使用的是Idea的话,它是把图片上传到了target这样一个文件夹内image-20220917171433341

如果想获取这个路径的图片可以通过tomcat设置一个虚拟的路径:

image-20220917171514074

image-20220917171541490

image-20220917171614081

设置完成后,通过 http://localhost:8080/虚拟路径文件夹/文件名,即可获取上传的图片

3.6.2、文件下载

使用ResponseEntity实现下载文件的功能。

将上面上传的文件下载:

<tr>
    <td>照片:</td>
    <td th:if="${message}eq'上传成功'">
        <img th:src="@{'http://localhost:8080/upload/'+${filename}}" width='200px' height='200px'/><br>
        <a th:href="@{/downLoadFile(fileName=${filename})}">点击下载</a>
    </td>
</tr>
@RequestMapping("/downLoadFile")
public ResponseEntity<byte[]> downLoadFile(HttpServletRequest request, String fileName) throws IOException {
    //得到图片的实际路径
    String realPath = request.getSession().getServletContext().getRealPath("/upload/");
    realPath = realPath+fileName;
    //创建该图片的对象
    File file = new File(realPath);
    //将图片数据读取到字节数组中
    byte[] bytes = FileUtils.readFileToByteArray(file);
    //创建 HttpHeaders 对象设置响应头信息
    HttpHeaders httpHeaders = new HttpHeaders();
    //设置图片下载的方式和文件名称
    httpHeaders.setContentDispositionFormData("attachment", toUTF8String(fileName));
    httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
    return new ResponseEntity<>(bytes, httpHeaders, HttpStatus.OK);
}

public String toUTF8String(String str) {
    StringBuffer sb = new StringBuffer();
    int len = str.length();
    for (int i = 0; i < len; i++) {
        // 取出字符中的每个字符
        char c = str.charAt(i);
        // Unicode码值为0~255时,不做处理
        if (c <= 255) {
            sb.append(c);
        } else { // 转换 UTF-8 编码
            byte b[];
            try {
                b = Character.toString(c).getBytes("UTF-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
                b = null;
            }
            // 转换为%HH的字符串形式
            for (int value : b) {
                int k = value;
                if (k < 0) {
                    k &= 255;
                }
                sb.append("%" + Integer.toHexString(k).toUpperCase());
            }
        }
    }
    return sb.toString();
}
image-20220917174738732

image-20220917174752383

3.7、国际化配置

国际化(i18n)(internationalization的首末字符i和n,18为中间的字符数)是指软件开发时应该具备支持多种语言和地区的功能。也就是根据不同国家显示不同的语言(中国人阅读为汉语,美国人为英语,韩国人为韩语等等)。

在 Spring 项目中实现国际化,通常需要以下 4 步:

  1. 编写国际化资源文件:文件名格式为:基本名-语言代码-国家或地区代码,例如 messages_zh_CN.properties。

    userName=用户名
    password=密码
    welcome=欢迎您
    submit=提交
    reset=重置
    
    userName=userName
    password=password
    welcome=Welcome
    submit=submit
    reset=reset
    

    写完之后IDEA会自动归类这种文件

    image-20220917175831691

  2. 在Spring MVC xml配置文件进行配置

    <!-- 国际化配置:对资源文件进行绑定 -->
    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basename" value="messages"/>
        <property name="defaultEncoding" value="UTF-8"/>
        <property name="cacheSeconds" value="0"/>
    </bean>
    <!-- 在界面上进行切换,Session -->
    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
        <property name="defaultLocale" value="en_US"/>
    </bean>
    <!--用于获取请求中的国际化信息并将其转换为 Locale 对象,获取 LocaleResolver 对象对国际化资源文件进行解析。-->
    <mvc:interceptors>
        <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
            <property name="paramName" value="lang"/>
        </bean>
    </mvc:interceptors>
    
  3. 在页面中获取国际化内容;

    <body>
        <h1 th:text="主页+#{welcome}"></h1>
        <tr>
            <td th:text="#{userName}"></td>
            <td><input type="text" name="userName" required><br></td>
        </tr>
        <tr>
            <td th:text="#{password}"></td>
            <td><input type="password" name="password" required><br></td>
        </tr>
        <tr>
            <td colspan="2" align="center">
                <input type="submit" th:value="#{submit}">
                <input type="reset" th:value="#{reset}">
            </td>
        </tr>
        <a th:href="@{/localeChange(lang=en_US)}">英文</a>
        <a th:href="@{/localeChange(lang=zh_CN)}">中文</a><br/>
    </body>
    
  4. 编写控制器方法手动切换语言。

    @Controller
    public class I18nController  {
        @Autowired
        private ResourceBundleMessageSource messageSource;
    
        @RequestMapping("/localeChange")
        public String localeChange(Locale locale) {
            String userName = messageSource.getMessage("userName", null, locale);
            String password = messageSource.getMessage("password", null, locale);
            String submit = messageSource.getMessage("submit", null, locale);
            String reset = messageSource.getMessage("reset", null, locale);
            return "index";
        }
    }
    
image-20220917182151799 image-20220917182206344

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

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

相关文章

Spring基础知识(Spring注解开发大全)

原本xml文件写法 文件头 文件信息 配置Bean 初步修改的xml文件写法 文件头 文件信息 <context:component-scan base-package"要扫描的包"/>注解开发Bean 第一步&#xff1a;写config文件 Configuration//代表xml文件的文件头 ComponentScan(“要扫描的包”…

大型JAVA版云HIS医院管理系统源码 Saas应用+前后端分离+B/S架构

SaaS运维平台多集团多医院入驻强大的电子病历完整文档 有源码&#xff0c;有演示&#xff01; 云HIS系统技术栈&#xff1a; 1、前端框架&#xff1a;AngularNginx 2、后台框架&#xff1a;JavaSpring&#xff0c;SpringBoot&#xff0c;SpringMVC&#xff0c;SpringSecurity&…

【2022.1.3】手脱压缩壳练习(含练习exe)

【2022.1.3】手脱压缩壳练习&#xff08;含练习exe&#xff09; 文章目录【2022.1.3】手脱压缩壳练习&#xff08;含练习exe&#xff09;0、简介1、单步跟踪法&#xff08;#&#xff09;方法介绍&#xff08;0&#xff09;练习exe下载&#xff08;1&#xff09;、查看源程序&am…

精确率与召回率,ROC曲线与PR曲线

精确率与召回率&#xff0c;ROC曲线与PR曲线 在机器学习的算法评估中&#xff0c;尤其是分类算法评估中&#xff0c;我们经常听到精确率(precision)与召回率(recall)&#xff0c;ROC曲线与PR曲线这些概念&#xff0c;那这些概念到底有什么用处呢&#xff1f; 首先&#xff0c…

Linux系统GPIO应用编程

目录应用层如何操控GPIOGPIO 应用编程之输出GPIO 应用编程之输入GPIO 应用编程之中断在开发板上测试GPIO 输出测试GPIO 输入测试GPIO 中断测试本章介绍应用层如何控制GPIO&#xff0c;譬如控制GPIO 输出高电平、或输出低电平。应用层如何操控GPIO 与LED 设备一样&#xff0c;G…

【办公类05-03】Python批量修改文件名前面的序号(已有的序号错了,需要改成正确的号码)

背景需求下载教程&#xff0c;手动输入编号&#xff0c;有一个编号错误&#xff0c;导致后面所有编号都错了。30实际是29&#xff0c;以此类推怎样才能快速修改编号数字&#xff1f;前期考虑到可能要改编号&#xff0c;所以在每个编号后面加“ ”&#xff08;空格&#xff09;&…

python版协同过滤算法图书管理系统

基于协同过滤算法的图书管理系统 一、简介&#xff08;v信&#xff1a;1257309054&#xff09; ​ 本系统基于推荐算法给用户实现精准推荐图书。 ​ 根据用户对物品或者信息的偏好&#xff0c;发现物品或者内容本身的相关性&#xff0c;或者是发现用户的相关性&#xff0c;然…

Typora上传文档图片链接失效的问题+PicGo布置图床在Github

文章目录typora图片链接失效原因PicGO开源图床布置先配置Github2.1先创建新仓库、用于存放图片2.2生成一个token&#xff0c;用picGo访问github3.下载picGo,并进行配置3.1 配置v4.1typora图片链接失效原因 因为你是保存在本地的&#xff0c;因此图片是不能访问&#xff0c;可以…

laravel 邮件发送

配置 Laravel 的邮件服务可以通过 config/mail.php 配置文件进行配置。 邮件中的每一项都在配置文件中有单独的配置项&#xff0c;甚至是独有的「传输方式」&#xff0c;允许你的应用使用不同的邮件服务发送邮件 mailers > [smtp > [transport > smtp,host > env(M…

【超级猜图案例上半部分的实现 Objective-C语言】

一、超级猜图这么一个案例: 1.实现之后的效果是这样的: 1)中间有一个图片,点一下,能放大,背景变半透明的黑色: 2)再点一下图片,或者点周围黑色的阴影,图片回归原状, 3)右边有一个“大图”按钮,点一下,实现跟点图片一样的效果, 4)左边有一个“提示”按钮,点…

【Java学习笔记】4.Java 对象和类

前言 本章介绍Java的对象和类。 Java 对象和类 Java作为一种面向对象语言。支持以下基本概念&#xff1a; 多态继承封装抽象类对象实例方法重载 本节我们重点研究对象和类的概念。 对象&#xff1a;对象是类的一个实例&#xff08;对象不是找个女朋友&#xff09;&#x…

为什么人们宁可用Lombok,也不把成员设为public?

目录专栏导读一、从零了解JavaBean1、基本概念2、JavaBean的特征3、JavaBean的优点二、定义最简单的JavaBean三、思考一个问题&#xff0c;为何属性是private&#xff0c;然后用get/set方法&#xff1f;四、下面系统的分析以下&#xff0c;why?五、不和谐的声音&#xff0c;禁…

MySQL实战解析底层---行锁功过:怎么减少行锁对性能的影响

目录 前言 从两阶段锁说起 死锁和死锁检测 前言 MySQL 的行锁是在引擎层由各个引擎自己实现的但并不是所有的引擎都支持行锁&#xff0c;比如MyISAM 引擎就不支持行锁不支持行锁意味着并发控制只能使用表锁&#xff0c;对于这种引擎的表&#xff0c;同一张表上任何时刻只能有…

[深入理解SSD系列综述 1.5] SSD固态硬盘参数图文解析_选购固态硬盘就像买衣服?

版权声明&#xff1a;付费作品&#xff0c;未经许可&#xff0c;不可转载前言SSD &#xff08;Solid State Drive&#xff09;&#xff0c;即固态硬盘&#xff0c;通常是一种以半导体闪存&#xff08;NAND Flash&#xff09;作为介质的存储设备。SSD 以半导体作为介质存储数据&…

Python进阶-----面对对象4.0(面对对象三大特征之--继承)

目录 前言&#xff1a; Python的继承简介 1.什么是继承 2.继承的好处 3.object类 继承的相关用法 1.继承的定义与法则 2.对继承的重写 3.&#xff08;单继承&#xff09;多层继承 4.多继承 5.多继承重写时调用父类方法 前言&#xff1a; 在讲之前&#xff0c;我想说说中…

servlet注解开发

文章目录servlet注解开发内容回顾响应对象 HttpServletResponse重定向与请求转发ServletConfig简介案例ServletContext简介案例Servlet 注解开发简介注解使用案例WebServlet 注解详细参数综合的增删改查案例登录注册功能servlet注解开发 内容回顾 响应对象 HttpServletRespon…

推荐一个日历转换开源工具库,支持C#、Java、PHP等主流的语言

更多开源项目请查看&#xff1a;一个专注推荐.Net开源项目的榜单 日历对我们来说&#xff0c;最熟悉的就是阳历和农历&#xff0c;在中国每年都有固定的节日、节气、中国特有传统节日&#xff0c;有些节日是固定的&#xff0c;但是节气这些都需要我们经过一定规则换算出来。 所…

【JavaSE】数组的定义和使用(上)

数组的定义和使用&#xff08;上&#xff09;6-数组的定义与使用1. 数组的基本概念1.1 为什么要使用数组1.2 什么是数组1.3 数组的创建及初始化1.3.1 数组的创建1.3.2 数组的初始化1.4 数组的使用1.4.1 数组中元素的访问1.4.2 遍历数组2. 数组是引用类型2.1 初始JVM的内存分布2…

【Python - Matplotlib】P1 Matplotlib2D 快速入门

Matplotlib 2D什么是&#xff0c;为什么选择快速上手三层结构图像层结构一览图画图三步法补充画布设置设定图像的长宽以及清晰度代码将图片保存前言 本节为 Matplotlib 简单专题第一节&#xff0c;简单介绍 Matplotlib 的结构&#xff0c;画图三步法&#xff0c;以及介绍一个简…

认识Spring(上)

作者&#xff1a;~小明学编程 文章专栏&#xff1a;Spring框架 格言&#xff1a;热爱编程的&#xff0c;终将被编程所厚爱。 目录 什么是spring 什么是IOC 传统开发 IOC DI spring的创建使用 pom.xml spring.xml 取出bean对象 ApplicationContext BeanFactory App…