Servlet3.0 multipart 文件上传技术

Servlet3.0 javaConfig配置
传统的servlet都是在web.xml中配置,从Servlet 3.0开始提供了ServletContainerInitializer接口,允许使用代码去配置servlets、filters、listeners。
 Spring为我们提供了一个该接口的实现类SpringServletContainerInitializer,查看源代码可以知道该类通过@HandlesTypes()注解指定了onStartup()方法的第一个参数接收WebApplicationInitializer实现类的集合。所以如果我们要使用这种方式配置servlet,只需要实现WebApplicationInitializer 接口即可。
  1. publicclassWebInitializerimplementsWebApplicationInitializer {
 
  1.     privatestaticfinal Logger logger = LoggerFactory.getLogger(WebInitializer.class);
 
  1.     @Override
  1.     publicvoidonStartup(javax.servlet.ServletContext servletContext) throws ServletException {
  1.         logger.info("begin init web application.");
 
  1.         //配置Spring
  1.         AnnotationConfigWebApplicationContext springContext = new AnnotationConfigWebApplicationContext();
  1.         springContext.register(SpringConfig.class);
  1.         
  1.         //添加linstener
  1.         servletContext.addListener(new ContextLoaderListener(springContext));
 
  1.         //添加servlet
  1.         ServletRegistration.Dynamic dispatcher = servletContext.addServlet(
  1.                 "dispatcher", new DispatcherServlet(springContext));
  1.         dispatcher.setLoadOnStartup(1);
  1.         dispatcher.addMapping("/");
 
  1.         //添加filter
  1.         LoggerFilter loggerFilter = new LoggerFilter();
  1.         FilterRegistration.Dynamic logFilterRegistration=container.addFilter("requestResponseLogFilter", loggerFilter);
  1.         logFilterRegistration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST, DispatcherType.ASYNC), false, "/*");
 
  1.         logger.info("init web application success.");
  1.     }
  1. }
Spring 配置
Spring的配置主要就是配置各种Bean,主要是要了解几种注解的使用方法。
 
@Configuration 注解 
相当于传统配置文件中的Beans,该类中的方法可以通过 @Bean标注为 bean
 
  1. @ConfigurationpublicclassSpringConfig {
  1.     @Bean(name = "exampleBean")
  1.     public ExampleBean getExampleBean() {
  1.         returnnew ExampleBean();
  1.     }
  1. }
@ComponentScan 注解
标明要扫描注解的包,相当于配置文件中的 context:component-scan。Spring会自动扫描注册指定包中使用注解指定的Bean。
  1. @ComponentScan(basePackages = {"com.example.service","com.example.dao"})
@PropertySource  注解
可以引入 properties配置文件,通过注入Environment对象可以很方便的拿到配置文件中的内容。
  1. @Configuration@PropertySource("classpath:config.properties")@ComponentScan(basePackages = {"com.example.service","com.example.dao"})publicclassSpringConfig {
 
  1.     @Autowired
  1.     private Environment env;
 
  1.     @Bean(name = "mysqlDataSource")
  1.     public DataSource mysqlDataSource() {
  1.         ProxoolDataSource dataSource = new ProxoolDataSource();
  1.         dataSource.setDriver(env.getProperty("ds.driver.classname"));
  1.         dataSource.setDriverUrl(env.getProperty("ds.url"));
  1.         dataSource.setUser(env.getProperty("ds.username"));
  1.         dataSource.setPassword(env.getProperty("ds.password"));
  1.         dataSource.setPrototypeCount(env.getProperty("proxool.prototype", Integer.class));
  1.         dataSource.setMinimumConnectionCount(env.getProperty("proxool.minimum", Integer.class));
  1.         dataSource.setMaximumConnectionCount(env.getProperty("proxool.maximum", Integer.class));
  1.         dataSource.setSimultaneousBuildThrottle(env.getProperty("proxool.simultaneous", Integer.class));
  1.         dataSource.setTestBeforeUse(true);
  1.         dataSource.setHouseKeepingTestSql(env.getProperty("proxool.testSql"));
  1.         return dataSource;
  1.     }
 
  1. }
 
文件上传功能简介
基本概念
要使用基于Servlet 3.0的多路传输转换功能:
1、在web.xml中为DispatcherServlet添加一个multipart-config元素
2、通过Servlet编程的方法使用MultipartConfigElement进行注册
3、自己定制了自己的Servlet类,那你必须使用 @MultipartConfig对其进行注解。
注意:诸如最大文件大小或存储位置等配置选项都必须在这个Servlet级别进行注册,因为Servlet 3.0不允许在解析器MultipartResolver的层级配置这些信息。
 
 
使用方法
在以前,处理文件上传是一个很痛苦的事情,大都借助于开源的上传组件,诸如commons fileupload等。现在好了,很方便,便捷到比那些组件都方便至极。
 
让Servlet支持上传,需要做两件事情
  1. 需要添加MultipartConfig注解
  1. 从request对象中获取Part文件对象
MultipartConfig注解
属性名 类型 是否可选 描述  
fileSizeThreshold int 当数据量大于该值时,内容将被写入文件。  
location String 存放生成的文件地址。  
maxFileSize long 允许上传的文件最大值。默认值为 -1,表示没有限制。  
maxRequestSize long 针对该 multipart/form-data 请求的最大数量,默认值为 -1,表示没有限制。  
         
一些实践建议:
  1. 若是上传一个文件,仅仅需要设置maxFileSize属性即可。
  1. 上传多个文件,可能需要设置maxRequestSize属性,设定一次上传数据的最大量。
  1. 上传过程中无论是单个文件超过maxFileSize值,或者上传总的数据量大于maxRequestSize值都会抛出IllegalStateException异常;
  1. location属性,既是保存路径(在写入的时候,可以忽略路径设定),又是上传过程中临时文件的保存路径,一旦执行Part.write方法之后,临时文件将被自动清除。
  1. 但Servlet 3.0规范同时也说明,不提供获取上传文件名的方法,尽管我们可以通过part.getHeader("content-disposition")方法间接获取得到。
  1. 如何读取MultipartConfig注解属性值,API没有提供直接读取的方法,只能手动获取。
 
参考文档:

posted on   Lemo_wd  阅读(1736)  评论(0编辑  收藏  举报

编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示