SpringMVC的MultipartHttpServletRequest

SpringMVC的MultipartHttpServletRequest

@RequestMapping("/upload")
public String upload(MultipartHttpServletRequest request) {
    MultipartFile file = request.getFile("upfile");
    File distFile = new File(request.getSession().getServletContext().getRealPath("/") + "template/" + file.getOriginalFilename());
    distFile.renameTo(new File("u"+new Date().toString()));//更新文件名
    try {
        file.transferTo(distFile);//把文件写到服务器
    } catch (IllegalStateException | IOException e1) {
        e1.printStackTrace();
    }
}
 

在开发Web应用程序时比较常见的功能之一,就是允许用户利用multipart请求将本地文件上传到服务器,而这正是Grails的坚固基石——SpringMVC其中的一个优势。Spring通过对ServletAPI的HttpServletRequest接口进行扩展,使其能够很好地处理文件上传。扩展后的接口名为org.springframework.web.multipart.MultipartHttpServletRequest,其内容如清单7-31所示。
清单7-31 org.springframework.web.multipart.MultipartHttpServletRequest接口

interface MultipartHttpServletRequest extends HttpServletRequest{
	public MultipartFile getFile(String name);
	public Map getFileMap();
	public Iterator getFileNames();
}

如清单所示,MultipartHttpServletRequest接口简单地扩展了默认的HttpServletRequest接口,并提供一些用来处理请求文件的方法。
7.10.1 使用multipart请求
实际上只要发现一个multipart请求,就表明在控制器实例中存在一个实现MultipartHttpServletRequest接口的request对象。我们可以通过清单7-31所示的方法来访问multipart请求中的上传文件,不过在处理上传文件之前,先来看一下上传表单的内容,如清单7-32所示。
清单7-32 上传表单示例

<form action="upload"enctype="multipart/form-data">
	<input type="file" name="myFile"/>
	<input type="submit" value="Upload! "/>
</form>

粗体显示的是需要注意的部分,实际上一个上传表单只需要满足如下两点。
l enctype属性的属性值设为multipart/form-data。
l input的type属性的属性值设为file。
在前面的示例中,标签中属性type的值为file,且name属性的值为myFile,之所以需要name属性值,是因为在使用接口MultipartHttpServletRequest的getFile方法时需要使用name属性的值。例如在清单7-33中,代码中的upload操作会从请求中读取上传文件。
读取上传文件

MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
Iterator<String> iter = multiRequest.getFileNames();
	while (iter.hasNext()) {	
		// 取得上传文件
		MultipartFile file = multiRequest.getFile(iter.next());
		if (file != null) {
			//获取 input 控件 name属性值
			String name = file.getName();
			System.out.println(name);
		}
	}
}

注意getFile方法不会返回一个java.io.File的实例,而是返回org.springframework.web.multipart.MultipartFile的一个实例,关于org.springframework.web.multipart.MultipartFile的详细信息,请参考清单7-34。如果在请求中没有找到文件则getFile方法返回null。
清单7-34 org.springframework.web.multipart.MultipartFile接口

interface MultipartFile {

public byte[] getBytes();

public String getContentType();

public java.io.InputStream getInputStream();

public String getName();

public String getOriginalFilename();

public long getSize();

public boolean isEmpty();

public void transferTo(java.io.File dest);

}

在MultipartFile接口中定义了如下很多有用的方法。
l 使用getSize()方法获得文件长度,以此决定允许上传的文件大小。
l 使用isEmpty()方法判断上传文件是否为空文件,以此决定是否拒绝空文件。
l 使用getInputStream()方法将文件读取为java.io.InputStream流对象。
l 使用getContentType()方法获得文件类型,以此决定允许上传的文件类型。
l 使用transferTo(dest)方法将上传文件写到服务器上指定的文件。

作者:风的低语
链接:https://www.jianshu.com/p/e2795b9e7aaf
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 在注解模式下,搭建SpringMVC框架的流程如下: (1)添加SpringMVC相关依赖,包括spring-webmvc、javax.servlet-api等。 (2)在web.xml中配置DispatcherServlet,将其作为应用程序的前端控制器。 (3)在Spring配置文件中配置组件扫描,用于扫描所有的控制器类。 (4)在控制器类上添加@Controller注解,声明该类是一个控制器。 (5)在控制器类中,使用@RequestMapping注解来映射请求URL和处理器方法。 (6)在处理器方法中,可以使用@RequestParam注解来接收请求参数,使用@ResponseBody注解来返回响应数据。 2. 在SpringMVC模式下实现文件上传的过程如下: (1)在Spring配置文件中配置MultipartResolver,用于处理文件上传请求。 (2)在控制器类中,使用@RequestMapping注解来映射文件上传请求的URL和处理器方法。 (3)在处理器方法中,使用@RequestParam注解来接收上传的文件,可以使用MultipartFile类型来接收文件。 (4)在处理器方法中,使用MultipartHttpServletRequest来获取上传文件的详细信息。 (5)在处理器方法中,可以将上传的文件保存到本地文件系统或者云存储中,然后返回上传结果。 3. 在SpringMVC模式下,Controller接收请求参数的多种方式包括: (1)使用@RequestParam注解来接收请求参数,可以指定参数名、是否必须、默认值等属性。 (2)使用@PathVariable注解来接收路径变量,即URL中的占位符。 (3)使用@RequestBody注解来接收请求体中的JSON或XML格式数据。 (4)使用HttpServletRequest对象来获取请求参数,可以获取URL参数、请求头、请求体等信息。 (5)使用@InitBinder注解来定义表单数据的转换器或校验器,用于将请求参数转换成业务对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值