当前位置: 首页 > news >正文

javaee实验:文件上传及拦截器的使用

目录

  • 文件上传
  • @ModelAttribute注解
  • 实验目的
  • 实验内容
  • 实验过程
    • 项目结构
    • 编写代码
    • 结果展示

文件上传

Spring MVC 提供 MultipartFile 接口作为参数来处理文件上传。
MultipartFile 提供以下方法来获取上传的文件信息:
 getOriginalFilename 获取上传的文件名字;
 getInputStream 获取一个 InputStream;
 getSize 上传文件的大小
 isEmpty 文件上传内容为空,或者没有文件上传
如果上传单个文件,使用 MultipartFile 类对象接收单个上传文件,如果是同时上传多个
文件,则使用 MultipartFile 数组类来接收多个文件。
例 1:单个文件上传

@PostMapping("/upload/multipart")
@ResponseBody
public Map<String, Object> upload(@RequestParam("photo") MultipartFile
photo)
{
。。。
} 
其中,upload 方法参数类型为 MultipartFile,使用 photo 对象接收单个上传文件,
@RequestParam("photo")获取请求参数“photo”值,该变量名称与视图表单中的名称对
应。
<input type="file" name="photo" value="请选择上传的文件" />

例 2:批量文件上传

 @PostMapping("/upload/multipart1")
@ResponseBody
// 使用Spring MVC的MultipartFile类作为参数
public Map<String, Object> upload1(@RequestParam("photo") 
MultipartFile[] photos){。。。}

2
其中,upload1 方法参数类型为 MultipartFile[],即使用数组来接收多个上传的文
件。这要求 HTTP 请求中包含有多个名字为“photo”的文件。

 <form method="post"action="./multipart1" enctype="multipart/form-data"><input type="file" name="photo" value="请选择上传的文件" /><p><input type="file" name="photo" value="请选择上传的文件" /><p><input type="file" name="photo" value="请选择上传的文件" /><p> <input type="submit" value="提交" /></form>

@ModelAttribute注解

@ModelAttribute 注解主要是将请求参数绑定到 Model 对象上。@ModelAttribute 注解只
有一个 Value 属性,类型为 String,表示绑定的属性名称。当 Controller 类中有任意一个方法
被@ModelAttribute 注解标记,页面请求只要进入这个控制器,不管请求哪个方法,均会先
执行被@ModelAttribute 标记的方法,所以可以用@ModelAttribute 注解的方法做一些初始化
操作。当同一个 Controller 类中有多个方法被@ModelAttribute 注解标记,所有被
@ModelAttribute 注解标记的方法均会被执行,按先后顺序执行,然后再进图请求的方法。

实验目的

(1) 掌握 MultipartFile 类的使用
(2) 掌握 Spring MVC 实现文件上传方法
(3) 掌握@ModelAttribute 注解的使用方法

实验内容

(1) Spring MVC 框架实现单文件上传。
(2) Spring MVC 框架实现批量文件上传。
(3) @ModelAttribute 注解应用

实验过程

项目结构

在这里插入图片描述
当然原本uploaded里面是什么都没有的,这里本来就是存放上传的文件的地方

编写代码

FileController

import org.springframework.stereotype.Controller;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.SimpleFormatter;@Controller
public class FileController {// 定义一个跳转到上传页面的方法,映射到/upload/page路径@GetMapping("/upload/page")public String uploadPage(){return "/file/upload";}// 定义一个处理文件上传的方法,映射到/upload/multipart路径@PostMapping("/upload/multipart")@ResponseBody//使用Spring MVC的MultipartFile数组作为参数,对应了保存的临时文件public Map<String,Object> upload(@RequestParam("photo")MultipartFile[] photos){String path="D:/idea/code/java/MultipartFile/src/main/resources/uploaded/";//保存路径// 定义一个计数器,用于记录上传成功的文件个数int count = 0;// 遍历上传的文件数组for (MultipartFile photo : photos) {// 使用日期格式化类来生成文件名String filename=new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());//获取上传文件的后缀suffixString suffix=photo.getOriginalFilename().substring(photo.getOriginalFilename().lastIndexOf("."));// 判断文件的后缀是否是.jpg,如果不是则跳过这个文件if(!suffix.equals(".jpg")){continue;}try {// 创建一个文件对象,指定保存的位置和文件名File destFile = new File(path + filename + suffix);// 判断文件的父目录是否存在,如果不存在则创建if (!destFile.getParentFile().exists()) {destFile.getParentFile().mkdirs();}// 将文件保存到指定的位置photo.transferTo(destFile);// 将计数器加一count++;}catch (IOException e){// 捕获异常并打印e.printStackTrace();}}// 判断计数器是否大于零,如果是则表示有文件上传成功if (count > 0) {// 返回一个成功的提示信息return dealResultMap(true,"上传成功,共上传了" + count + "个文件");} else {// 返回一个失败的提示信息return dealResultMap(false,"上传失败,没有符合条件的文件");}}//处理上传文件结果private Map<String,Object>dealResultMap(boolean success,String msg){Map<String,Object> result=new HashMap<String,Object>();result.put("success",success);result.put("msg",msg);return result;}}

upload.html

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>文件上传</title>
</head>
<body>
<h1>文件上传</h1>
<p>请选择一个.jpg格式的图片文件,然后点击上传按钮,将文件上传到服务器。</p>
<form action="/upload/multipart" method="post" enctype="multipart/form-data"><input type="file" name="photo" accept="image/jpeg"><input type="submit" value="上传">
</form>
<div id="result"></div>
<script>// 获取表单元素var form = document.querySelector("form");// 获取结果元素var result = document.getElementById("result");// 监听表单的提交事件form.addEventListener("submit", function(event) {// 阻止表单的默认提交行为event.preventDefault();// 创建一个FormData对象,用于封装表单数据var formData = new FormData(form);// 创建一个XMLHttpRequest对象,用于发送异步请求var xhr = new XMLHttpRequest();// 设置请求的方法和地址xhr.open("POST", "/upload/multipart");// 设置请求的响应类型为JSONxhr.responseType = "json";// 设置请求的回调函数xhr.onload = function() {// 判断请求的状态是否成功if (xhr.status === 200) {// 获取响应的数据var data = xhr.response;// 判断上传的结果是否成功if (data.success) {// 显示成功的提示信息result.innerHTML = "<p style='color:green'>" + data.msg + "</p>";} else {// 显示失败的提示信息result.innerHTML = "<p style='color:red'>" + data.msg + "</p>";}} else {// 显示错误的提示信息result.innerHTML = "<p style='color:red'>请求失败,状态码:" + xhr.status + "</p>";}};// 发送请求xhr.send(formData);});
</script>
</body>
</html>

MultipartFileApplication

import com.example.multipartfile.controller.FileController;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class MultipartFileApplication {public static void main(String[] args) {SpringApplication.run(MultipartFileApplication.class, args);}}

结果展示

搜索自己对应的url
在这里插入图片描述
单击选择文件,打开文件夹进行文件的选择
在这里插入图片描述
选择好文件
在这里插入图片描述
点击上传
在这里插入图片描述
返回idea中查看
在这里插入图片描述
在选择的保存路径uploaded中出现了我们选择上传的图片,当然也可以选择多文件上传,只要同时选择多个文件,然后点击上传就可以了

相关文章:

javaee实验:文件上传及拦截器的使用

目录 文件上传ModelAttribute注解实验目的实验内容实验过程项目结构编写代码结果展示 文件上传 Spring MVC 提供 MultipartFile 接口作为参数来处理文件上传。 MultipartFile 提供以下方法来获取上传的文件信息&#xff1a;  getOriginalFilename 获取上传的文件名字&#x…...

二分查找19(Leetcode540有序数组中的单一元素)-1

代码&#xff1a; 没用二分查找版&#xff1a; class Solution {public int singleNonDuplicate(int[] nums) {if(nums.length1){return nums[0];}for(int i1;i<nums.length-1;i){if(nums[i-1]nums[i]||nums[i]nums[i1]){continue;}else{return nums[i];}}if(nums[0]nums[…...

字节开源的netPoll底层LinkBuffer设计与实现

字节开源的netPoll底层LinkBuffer设计与实现 为什么需要LinkBuffer介绍设计思路数据结构LinkBufferNodeAPI LinkBuffer读 API写 APIbook / bookAck api 小结 本文基于字节开源的NetPoll版本进行讲解&#xff0c;对应官方文档链接为: Netpoll对应官方文档链接 netPoll底层有一个…...

《点云进阶》专栏文章目录

目录 一、PCL进阶篇* 二、Open3D进阶篇 一、PCL进阶篇 * PCL 最小二乘拟合二维直线PCL 最小二乘拟合空间直线PCL 计算点云的倒角距离&#xff08;Chamfer Distance&#xff09;PCL 点云配准精度评价——点到面的均方根误差PCL 可视化八叉树PCL 计算Hausdorff距离PCL 从变换矩…...

二分查找算法-查找最接近的元素Python实现(题目来源dotcpp: 2926)

题目描述 在一个非降序列中&#xff0c;查找与给定值最接近的元素。 输入格式 第一行包含一个整数n&#xff0c;为非降序列长度。1 < n < 100000。 第二行包含n个整数&#xff0c;为非降序列各元素。所有元素的大小均在0-1,000,000,000之间。 第三行包含一个整数m&#x…...

debian11,debian 如何删除虚拟内存,交换分区

1.以管理员身份登录系统 2.输入以下命令以删除虚拟内存,该命令将关闭当前正在使用的虚拟内存。 sudo swapoff -a 3.输入以下命令以永久删除虚拟内存(硬盘内存文件)&#xff1a; sudo rm /swapfile 4.重启系统 总结:以上步骤将删除 Debian 11 中的虚拟内存。请注意&#xf…...

智能优化算法应用:基于人工大猩猩部队算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于人工大猩猩部队算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于人工大猩猩部队算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.人工大猩猩部队算法4.实验参数设…...

鼎捷受邀出席“中国制造业产品创新数字化国际峰会”,共话工业软件创新发展

11月30日&#xff0c; 由e-works数字化企业网、四川省智能制造创新中心、重庆制信信息技术服务有限公司主办的第十九届中国制造业产品创新数字化国际峰会在四川成都盛大开幕。 作为制造业研发信息化领域规模、影响力兼具的专业论坛&#xff0c;本届峰会以“构建基于数字底座的…...

大话数据结构-查找-多路查找树

注&#xff1a;本文同步发布于稀土掘金。 7 多路查找树 多路查找树&#xff08;multi-way search tree&#xff09;&#xff0c;其每个结点的孩子可以多于两个&#xff0c;且每一个结点处可以存储多个元素。由于它是查找树&#xff0c;所有元素之间存在某种特定的排序关系。 …...

unity 2d 入门 飞翔小鸟 飞翔脚本(五)

新建c#脚本 using System.Collections; using System.Collections.Generic; using UnityEngine;public class Fly : MonoBehaviour {//获取小鸟&#xff08;刚体&#xff09;private Rigidbody2D bird;//速度public float speed;// Start is called before the first frame up…...

Linux系统调试课:I2C tools调试工具

文章目录 一、如何使用I2C tools测试I2C外设1、I2C tools概述: 2、下载I2C tools源码:3、编译I2C tools源码: 4、i2cdetect 5、i2cget 6、i2cdump...

uniapp中解决swiper高度自适应内容高度

起因&#xff1a;uniapp中swiper组件swiper 标签存在默认高度是 height: 150px &#xff1b;高度无法实现由内容撑开&#xff0c;在默认情况下&#xff0c;swiper盒子高度显示总是 150px 解决办法思路&#xff1a; 动态设置swiper盒子的高度&#xff0c;故需要获取swiper-item盒…...

Contrast and Generation Make BART a Good Dialogue Emotion Recognizer

摘要 在对话系统中&#xff0c;具有相似语义的话语在不同的语境下可能具有不同的情感。因此&#xff0c;用说话者依赖来建模长期情境情绪关系在对话情绪识别中起着至关重要的作用。同时&#xff0c;区分不同的情绪类别也不是很简单的&#xff0c;因为它们通常具有语义上相似的…...

图的深度优先搜索(数据结构实训)

题目&#xff1a; 图的深度优先搜索 描述&#xff1a; 图的深度优先搜索类似于树的先根遍历&#xff0c;是树的先根遍历的推广。即从某个结点开始&#xff0c;先访问该结点&#xff0c;然后深度访问该结点的第一棵子树&#xff0c;依次为第二顶子树。如此进行下去&#xff0c;直…...

VUEX使用总结

1、Store 使用 文件内容大概就是这三个。通俗来讲actions负责向后端获取数据的&#xff0c;内部执行异步操作分发 Action&#xff0c;调用commit提交一个 mutation。 mutations通过Action提交commit的数据进行提交荷载&#xff0c;使state有数据。 vuex的数据是共享的&#xf…...

指定分隔符对字符串进行分割 numpy.char.split()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 指定分隔符对字符串进行分割 numpy.char.split() 选择题 请问下列程序运行的的结果是&#xff1a; import numpy as np print("【执行】np.char.split(I.Love.China, sep .)") p…...

Android12蓝牙框架

参考&#xff1a; https://evilpan.com/2021/07/11/android-bt/ https://source.android.com/docs/core/connect/bluetooth?hlzh-cn https://developer.android.com/guide/topics/connectivity/bluetooth?hlzh-cn https://developer.android.com/guide/components/intents-fi…...

python文件docx转pdf

centos部署的django项目&#xff0c;使用libreoffice做文件转换&#xff0c;官网给环境安装好libreoffice后&#xff0c;可使用命令行来进行转化 还可转换其他的各种格式&#xff0c;本文只做了pdf转换 import subprocess import os def convert_to_pdf(input_file, o…...

9.基于SpringBoot3+I18N实现国际化

1. 新建资源文件 在resources目录下新建目录i18n, 然后 新建messages_en.properties文件 user.login.erroraccount or password error&#xff01;新建messages_zh_CN.properties文件 user.login.error帐户或密码错误&#xff01;2. 新建LocaleConfig.java文件 Configurati…...

27. 深度学习进阶 - 为什么RNN

文章目录 一个柯基的例子为什么RNN or CNN Hi&#xff0c;你好。我是茶桁。 这节课开始&#xff0c;我们将会讲一个比较重要的一种神经网络&#xff0c;它对应了咱们整个生活中很多类型的一种问题结构&#xff0c;它就是咱们的RNN网络。 咱们首先回忆一下&#xff0c;上节课咱…...

谈一谈柔性数组

文章目录 什么是柔性数组柔性数组有什么用 什么是柔性数组 柔性数组是一种动态可变的数组&#xff0c;也许你从来没有听说过这个概念&#xff0c;但是它确实是存在的&#xff0c;是在C99标准底下支持的一种语法。想要使用柔性数组需要满足3个条件&#xff1a; 柔性数组只能存在…...

<Linux>(极简关键、省时省力)《Linux操作系统原理分析之Linux文件管理(1)》(25)

《Linux操作系统原理分析之Linux文件管理&#xff08;1&#xff09;》&#xff08;25&#xff09; 8 Linux文件管理8.1 Linux 文件系统概述8.2 EXT2 文件系统8.2.1 EXT2 文件系统的构造8.2.2 EXT2 超级块&#xff08;super block&#xff09;8.2.3 组描述符8.2.4 块位图 8.3 EX…...

算能PCIe开发环境搭建-一些记录

开发环境与运行环境&#xff1a; 开发环境是指用于模型转换或验证以及程序编译等开发过程的环境&#xff1b;运行环境是指在具备Sophon设备的平台上实际使用设备进行算法应用部署的运行环境。 开发环境与运行环境可能是统一的&#xff08;如插有SC5加速卡的x86主机&#xff0c;…...

使用C#和HtmlAgilityPack打造强大的Snapchat视频爬虫

概述 Snapchat作为一款备受欢迎的社交媒体应用&#xff0c;允许用户分享照片和视频。然而&#xff0c;由于其特有的内容自动消失特性&#xff0c;爬虫开发面临一些挑战。本文将详细介绍如何巧妙运用C#和HtmlAgilityPack库&#xff0c;构建一个高效的Snapchat视频爬虫。该爬虫能…...

c/c++的字符和字符串输入输出

注&#xff1a; 1.下面这些为本人大学四年所用过的处理办法&#xff0c; 至今为止遇到的所有编程题都能够使用。如果需要了解更多关于putchar,cin.get,cin.getline等的请自行搜索。 2.getchar相当于获取一个字符&#xff0c;可以实现单个字符的输入以及通过循环实现多个字符输…...

学习设计模式的网站

Refactoring and Design Patternshttps://refactoring.guru/...

Hadoop学习笔记(HDP)-Part.08 部署Ambari集群

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …...

IDEA加载阿里Java规范插件

IDEA加载阿里巴巴Java开发手册插件&#xff0c;在写代码的时候会自动扫描代码规范。 1、打开Settings 2、打开Plugins 3、搜索Alibaba Java Code Guidelines&#xff08;XenoAmess TPM&#xff09;插件&#xff0c;点击Install进行安装&#xff0c;然后重启IDE生效。 4、鼠标右…...

【CSP】202305-1_重复局面Python实现

文章目录 [toc]试题编号试题名称时间限制内存限制题目背景问题描述输入格式输出格式样例输入样例输出样例说明子任务提示Python实现 试题编号 202305-1 试题名称 重复局面 时间限制 1.0s 内存限制 512.0MB 题目背景 国际象棋在对局时&#xff0c;同一局面连续或间断出现3次或3…...

html5各行各业官网模板源码下载(1)

文章目录 1.来源2.源码模板2.1 HTML5白色简洁设计师网站模板2.2 HTML5保护野生动物响应式网站模板 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/134682321 html5各行各业官网模板源码下载&#xff0c;这个主题覆盖各行…...