我们通过使用multipart请求数据接收和处理二进制信息(如文件)。DispatcherServlet并没有实现任何解析multipart请求数据的功能,它将该任务委托给了Spring中的multipart解析器,

通过MultipartResolver接口的实现,来解析multipart请求中的内容。

Spring3.1开始,Spring内置了两个MultipartResolver实现供我们选择:

1.CommonMultipartResolver

2.StandardServletMultipartResolver(推荐使用,由于使用Servlet所提供的功能支持,并不需要依赖任何其他的项目)

下面是具体实现过程:

一、配置multipart解析器

在Spring应用上下文中,我们现将StandardServletMultipartResolver声明为bean:

<!-- Multipart解析器配置 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.support.StandardServletMultipartResolver"/>

除此而外,我们还需要为StandardServletMultipartResolver设置相关参数。需要注意的是,StandardServletMultipartResolver无法直接通过property标签来设置(StandardServletMultipartResolver

没有构造参数,也没有要设置的属性),要设置相关参数,最简单的方法就是在web.xml配置中添加MultipartConfigElement:

<!-- multipart解析器参数配置 -->
<multipart-config>
<!--<location>/tmp/upload</location>-->
<max-file-size>2097152</max-file-size>
<max-request-size>4194304</max-request-size>
</multipart-config>

location配置了文件上传过程中所写入的临时路径(个人感觉和MultipartFile.transferTo()方法所造成的结果类似)

max-file-size规定了上传文件的大小(不超过2MB)

max-request-size规定了整个请求的大小(不超过4MB)

二、创建文件上传请求表单

配置好Multipart解析器后,我们需要一个简单的文件上传表单作为我们的前端视图:

<div>
upload file:
<form action="http://localhost:8080/trymaven/upload" method="post" enctype="multipart/form-data">
file: <input type="file" name="fileName"/>
<input type="submit" value="submit"/>
</form>
</div>

需要注意的是,我们在form标签中设置enctype属性的值为multipart/form-data,它将会告诉浏览器以multipart数据的形式提交表单,而不是以表单数据的形式进行提交。

除此而外,我们需要将input标签中的type属性值设置为file,时期接收一个二进制数据。

三、处理multipart请求

这里我们创建了一个新的Controller类用于响应处理mulitpart请求:

package example.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.multipart.MultipartFile; import java.io.File;
import java.io.IOException; @Controller
public class UploadFileController { @Value("#{settings['filePath']}")
private String filePath; @RequestMapping(value = "upload", method = RequestMethod.POST)
public String uploadFile(@RequestPart("fileName") MultipartFile file) throws IOException {
String path = filePath + new String(file.getOriginalFilename().getBytes(), "utf-8");
file.transferTo(new File(path));
return "uploadInfo";
} }

这里我们使用@RequestPart()注解指定MultipartFile类型的参数file接收请求中对应的part数据(这里也可以是byte,但是原始byte比较简单但是功能有限),

MultipartFile.transferTo(File)用于将上传的文件临时写入路径。

值得注意的是,这里我们将路径信息通过配置文件暴露在外面,用户可以通过修改配置文件修改临时路径

配置文件内容:

filePath=D:/任务/

设置配置文件路径:

<util:properties id="settings" location="classpath:file.properties" />

通过@Value()注解将配置文件中的key对应值注入变量

@Value("#{settings['filePath']}")
private String filePath;

settings为定义的id,['filePath']为配置文件中的key(若配置文件中路径有中文,要修改配置文件编码为utf-8,不然在运行项目时会出现路径映射问题)

经过测试后发现文件路径配置写在applicationContext.xml和dispatcher-servlet.xml中都可以。

四、运行项目

运行项目后,上传文件以及结果如下:

到指定临时目录下找到写入的文件:

构建web应用之——文件上传的更多相关文章

  1. JAVA Web 之 struts2文件上传下载演示(二)(转)

    JAVA Web 之 struts2文件上传下载演示(二) 一.文件上传演示 详细查看本人的另一篇博客 http://titanseason.iteye.com/blog/1489397 二.文件下载 ...

  2. JAVA Web 之 struts2文件上传下载演示(一)(转)

    JAVA Web 之 struts2文件上传下载演示(一) 一.文件上传演示 1.需要的jar包 大多数的jar包都是struts里面的,大家把jar包直接复制到WebContent/WEB-INF/ ...

  3. 构建multipart/form-data实现文件上传

    构建multipart/form-data实现文件上传 通常文件上传都是通过form表单中的file控件,并将form中的content-type设置为multipart/form-data.现在我们 ...

  4. 基于 java 【Web安全】文件上传漏洞及目录遍历攻击

    前言:web安全之文件上传漏洞,顺带讲一下目录遍历攻击.本文基于 java 写了一个示例. 原理 在上网的过程中,我们经常会将一些如图片.压缩包之类的文件上传到远端服务器进行保存.文件上传攻击指的是恶 ...

  5. WEB安全:文件上传漏洞

    文件上传漏洞过程 用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力. 一般的情况有: 上传文件WEB脚本语言,服务器的WEB容器解释并执行了用户上传的脚本,导致代码执行: ...

  6. IIS 之 通过 Web.config 修改文件上传大小限制设置方法

    在IIS 6.0中,不设置默认大小为4M,设置文件上传大小的方法,maxRequestLength(KB),executionTimeout(毫秒),配置如下节点: <system.web> ...

  7. web安全之文件上传漏洞攻击与防范方法

    一. 文件上传漏洞与WebShell的关系 文件上传漏洞是指网络攻击者上传了一个可执行的文件到服务器并执行.这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等.这种攻击方式是最为直接和有效 ...

  8. Web安全-之文件上传漏洞场景

    1   上传漏洞危害介绍 上传是Web中最常见的功能,如果上传功能存在设计.编码缺陷,就容易形成上传漏洞,从而成为致命的安全问题,攻击者可以通过上传脚本木马,实现查看/篡改/删除源码和任意涂鸦网页,可 ...

  9. web实现大文件上传分片上传断点续传

    需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在500M内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以501M来进行限制. 第一步: 前端修改 由于项目使用的是 ...

随机推荐

  1. 词云(wordcloud2.js js2wordcloud.js)

    npm安装: npm install js2wordcloud --save 用法 var wc = new Js2WordCloud(document.getElementById('contain ...

  2. 单例模式-懒汉式的一次多线程Debug

    单例模式要要点就是一个类只会存在一个实例,要想达到这种效果,最重要的就是将构造方法设置为私有,然后通过static的方法来获取对象. 上述设计并不线程安全,因为在lazySingleton = new ...

  3. 问题:Linux报swap空间占用过高,但物理内存还有空余

    报错 收到报警,swap空间占用过高,登录到系统查看内存使用详情,看到物理内存还有很多未使用 问题分析 Swap配置对性能的影响分配太多的Swap空间会浪费磁盘空间,而Swap空间太少,则系统会发生错 ...

  4. topcoder srm 575 div1

    problem1 link 如果$k$是先手必胜那么$f(k)=1$否则$f(k)=0$ 通过对前面小的数字的计算可以发现:(1)$f(2k+1)=0$,(2)$f(2^{2k+1})=0$,(3)其 ...

  5. [译]RabbitMQ教程C#版 - 主题

    先决条件 本教程假定 RabbitMQ 已经安装,并运行在localhost标准端口(5672).如果你使用不同的主机.端口或证书,则需要调整连接设置. 从哪里获得帮助 如果您在阅读本教程时遇到困难, ...

  6. 使用 pm2 优雅的部署 node 程序

    使用 pm2 优雅的部署 node 程序 # 启动并监控名字为 XXX 的 npm run start:dev 命令 pm2 start npm --watch --name XXX -- run s ...

  7. 【HNOI 2018】转盘

    Problem Description 一次小 \(G\) 和小 \(H\) 原本准备去聚餐,但由于太麻烦了于是题面简化如下: 一个转盘上有摆成一圈的 \(n\) 个物品(编号 \(1\) 至 \(n ...

  8. 承接VR外包,虚拟现实外包,北京正规公司

    我们制作各类型VR全景虚拟现实,增强现实视频制作.录制等项目.品质保证,售后完备,可签合同.contectus: 13911652504(技术经理tommy) 承揽VR外包 虚拟现实外包 U3D外包( ...

  9. IT - 偶像的力量

    [丹尼斯·里奇]C语言,unix之父 [本贾尼·斯特劳斯特卢普]C++之父 [詹姆斯·高斯林 (James Gosling)]Java之父 [林纳斯·托瓦兹(Linus Torvalds)]Linux ...

  10. VMware虚拟机安装CentOS 6.9图文教程

    1.Win7安装VMware虚拟机比较简单,直接从官网下载VMware安装即可,这里不再叙述. 2.接着从CentOS官网直接下载CentOS 6.9的iso镜像文件. 3.打开VMware,点击创建 ...