首页 文章 精选 留言 我的

精选列表

搜索[逻辑模型],共10000篇文章
优秀的个人博客,低调大师

SpringBoot2.0 基础案例(14):基于Yml配置方式,实现文件上传逻辑

一、文件上传 文件上传是项目开发中一个很常用的功能,常见的如头像上传,各类文档数据上传等。SpringBoot使用MultiPartFile接收来自表单的file文件,然后执行上传文件。该案例基于SpringBoot2.0中yml配置,管理文件上传的常见属性。该案例演示单文件上传和多文件上传。 二、搭建文件上传界面 1、引入页面模板Jar包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> 2、编写简单的上传页面 <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <body> <hr/> <h3>1、单文件上传</h3> <form method="POST" action="/upload1" enctype="multipart/form-data"> 上传人:<input type="text" name="userName" /><br/> 文件一:<input type="file" name="file" /><br/> <input type="submit" value="Submit" /> </form> <hr/> <h3>2、多文件上传</h3> <form method="POST" action="/upload2" enctype="multipart/form-data"> 上传人:<input type="text" name="userName" /><br/> 文件一:<input type="file" name="file" /><br/> 文件二:<input type="file" name="file" /><br/><br/> <input type="submit" value="Submit" /> </form> </body> </html> <hr/> 3、配置页面入口 import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller public class PageController { /** * 上传页面 */ @GetMapping("/uploadPage") public String uploadPage (){ return "upload" ; } } 三、与SpringBoot2.0整合 1、核心配置文件 上传文件单个限制max-file-size: 5MB上传文件总大小限制max-request-size: 6MB spring: application: # 应用名称 name: node14-boot-file servlet: multipart: # 启用 enabled: true # 上传文件单个限制 max-file-size: 5MB # 总限制 max-request-size: 6MB 2、文件上传核心代码 如果单个文件大小超出1MB,抛出异常FileSizeLimitExceededException:如果上传文件总大小超过6MB,抛出异常SizeLimitExceededException:这样就完全验证了YML文件中的配置,有效且正确。 import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import java.io.File; import java.util.Map; @RestController public class FileController { private static final Logger LOGGER = LoggerFactory.getLogger(FileController.class) ; /** * 测试单个文件上传 */ @RequestMapping("/upload1") public String upload1 (HttpServletRequest request, @RequestParam("file") MultipartFile file){ Map<String, String[]> paramMap = request.getParameterMap() ; if (!paramMap.isEmpty()){ LOGGER.info("paramMap == >>{}",paramMap); } try{ if (!file.isEmpty()){ // 打印文件基础信息 LOGGER.info("Name == >>{}",file.getName()); LOGGER.info("OriginalFilename == >>{}",file.getOriginalFilename()); LOGGER.info("ContentType == >>{}",file.getContentType()); LOGGER.info("Size == >>{}",file.getSize()); // 文件输出地址 String filePath = "F:/boot-file/" ; new File(filePath).mkdirs(); File writeFile = new File(filePath, file.getOriginalFilename()); file.transferTo(writeFile); } return "success" ; } catch (Exception e){ e.printStackTrace(); return "系统异常" ; } } /** * 测试多文件上传 */ @RequestMapping("/upload2") public String upload2 (HttpServletRequest request, @RequestParam("file") MultipartFile[] fileList){ Map<String, String[]> paramMap = request.getParameterMap() ; if (!paramMap.isEmpty()){ LOGGER.info("paramMap == >>{}",paramMap); } try{ if (fileList.length > 0){ for (MultipartFile file:fileList){ // 打印文件基础信息 LOGGER.info("Name == >>{}",file.getName()); LOGGER.info("OriginalFilename == >>{}",file.getOriginalFilename()); LOGGER.info("ContentType == >>{}",file.getContentType()); LOGGER.info("Size == >>{}",file.getSize()); // 文件输出地址 String filePath = "F:/boot-file/" ; new File(filePath).mkdirs(); File writeFile = new File(filePath, file.getOriginalFilename()); file.transferTo(writeFile); } } return "success" ; } catch (Exception e){ return "fail" ; } } } 四、源代码地址 GitHub地址:知了一笑 https://github.com/cicadasmile/spring-boot-base 码云地址:知了一笑 https://gitee.com/cicadasmile/spring-boot-base

优秀的个人博客,低调大师

使用jMeter构造逻辑上有依赖关系的一系列并发请求

相信前端开发工程师对CSRF(Cross-site request forgery)跨站请求伪造这个概念都非常熟悉,有的时候也简写成XSRF,是一种对网站的恶意利用。 尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装成受信任用户的请求来利用受信任的网站。 CSRF攻击的防御方式有多种,最简单最易实现的一种思路就是在客户端向服务器发起的请求中放入攻击者无法伪造的信息,并且该信息没有存储于 cookie 之中。技术上来说,当客户端向服务器发起请求执行一些敏感操作之前(比如用HTTP post实现的转账,扣款等功能),服务器端随机产生一个token,返回给客户端。客户端接下来的操作,必须在HTTP请求中以参数的形式把这个服务器端颁发的token带上。同时服务器端在实现给客户端分配toke

优秀的个人博客,低调大师

掌握 cinder-scheduler 调度逻辑 - 每天5分钟玩转 OpenStack(48)

上一节我们详细讨论了 cinder-api 和 cinder-volume,今天讨论另一个重要的 Cinder 组件 cinder-scheduler。 创建 Volume 时,cinder-scheduler 会基于容量、Volume Type 等条件选择出最合适的存储节点,然后让其创建 Volume。 下面介绍 cinder-scheduler 是如何实现这个调度工作的。 在 /etc/cinder/cinder.conf 中,cinder 通过 scheduler_driver, scheduler_default_filters 和 scheduler_default_weighers 这三个参数来配置 cinder-scheduler。 Filter scheduler Filter scheduler 是 cinder-scheduler 默认的调度器。 scheduler_driver=cinder.scheduler.filter_scheduler.FilterScheduler 与 Nova 一样,Cinder 也允许使用第三方 scheduler,配置 scheduler_driver 即可。 scheduler 调度过程如下: 通过过滤器(filter)选择满足条件的存储节点(运行 cinder-volume) 通过权重计算(weighting)选择最优(权重值最大)的存储节点。 可见,cinder-scheduler 的运行机制与 nova-scheduler 完全一样。 Filter 当 Filter scheduler 需要执行调度操作时,会让 filter 对计算节点进行判断,filter 返回 True 或者 False。 cinder.conf 中 scheduler_default_filters 选项指定 filter scheduler 使用的 filter,默认值如下: scheduler_default_filters = AvailabilityZoneFilter, CapacityFilter, CapabilitiesFilter Filter scheduler 将按照列表中的顺序依次过滤: AvailabilityZoneFilter 为提高容灾性和提供隔离服务,可以将存储节点和计算节点划分到不同的 Availability Zone 中。例如把一个机架上的机器划分在一个 Availability Zone 中。OpenStack 默认有一个命名为“Nova” Availability Zone 的,所有的节点初始都是放在“Nova”中。用户可以根据需要创建自己的 Availability Zone。 创建 Volume 时,需要指定 Volume 所属的 Availability Zone。 cinder-scheduler 在做 filtering 时,会使用 AvailabilityZoneFilter 将不属于指定 Availability Zone 的存储节点过滤掉。 CapacityFilter 创建 Volume 时,用户会指定 Volume 的大小。CapacityFilter 的作用是将存储空间不能满足 Volume 创建需求的存储节点过滤掉。 CapabilitiesFilter 不同的 Volume Provider 有自己的特性(Capabilities),比如是否支持 thin provision 等。Cinder 允许用户创建 Volume 时通过 Volume Type 指定需要的 Capabilities。 Volume Type 可以根据需要定义若干 Capabilities,详细描述 Volume 的属性。VolumeVolume Type 的作用与 Nova 的 flavor 类似。 Volume Type 在 Admin -> System -> Volume 菜单里管理 通过 Volume Type 的 Extra Specs 定义 Capabilities Extra Specs 是用 Key-Value 的形式定义。 不同的 Volume Provider 支持的 Extra Specs 不同,需要参考 Volume Provider 的文档。 上图所示的 Volume Type 只有一个 Extra Specs “volume_backend_name”,这是最重要也是必须的 Extra Specs。 cinder-volume 会在自己的配置文件 /etc/cinder/cinder.conf 中设置“volume_backend_name”这个参数,其作用是为存储节点的 Volume Provider 命名。 这样,CapabilitiesFilter 就可以通过 Volume Type 的“volume_backend_name”筛选出指定的 Volume Provider。 不同的存储节点可以在各自的 cinder.conf 中配置相同的 volume_backend_name,这是允许的。因为虽然存储节点不同,但它们可能使用的是一种 Volume Provider。 如果在第一步 filtering 环节选出了多个存储节点,那么接下来的 weighting 环节会挑选出最合适的一个节点。 Weighter Filter Scheduler 通过 scheduler_default_weighers 指定计算权重的 weigher,默认为 CapacityWeigher。 scheduler_default_weighers = CapacityWeigher 如命名所示,CapacityWeigher 基于存储节点的空闲容量计算权重值,空闲容量最大的胜出。 下一节我们将开始通过各种场景学习 Cinder。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册