基于SpringMVC的文件上传(Upload:上载)

21.1. 目标

在页面中点击浏览按钮,可以将指定的文件上传到服务器。

21.2. 创建项目

创建Maven Project,Group Id为cn.tedu.spring,Artifact Id为SPRINGMVC-UPLOAD,Packaging为war,创建好项目后,生成web.xml文件,添加spring-webmvc依赖,添加Tomcat运行环境(必须保证Eclipse中的Servers项目是打开的),复制spring的配置文件,删除所有已经存在的配置,复制前序项目中web.xml中的配置。

另外,为了实现文件上传,还需要添加依赖:

<dependency>
	<groupId>commons-fileupload</groupId>
	<artifactId>commons-fileupload</artifactId>
	<version>1.4</version>
</dependency>
21.3. 页面

webapp下创建index.html页面,并在页面中设计:

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

以上代码中,<form>method属性值必须是postenctype属性值必须是multipart/form-data,且上传控件的type属性值必须是file

21.4. 使用控制器接收请求

确定页面中表单的action属性的值为upload.do

检查spring.xml中配置的组件扫描为cn.tedu.spring

创建cn.tedu.spring.UploadController控制器类,并在类之前添加@Controller注解,然后,添加处理请求的方法:

@Controller
public class UploadController {

	@RequestMapping("upload.do")
	@ResponseBody
	public String upload() {
		System.out.println("UploadController.upload()");
		
		return "OK";
	}
	
}
21.5. 处理上传

在SpringMVC框架中,使用了CommonsMultipartResolver对上传的数据进行处理,需要在spring.xml中配置该类:

<bean id="multipartResolver"
	class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
</bean>

在配置时,必须指定id,且值必须是multipartResolver

关于以上节点,可以暂不配置详细信息。

然后,在处理请求的方法中,添加MultipartFile file参数,该参数就是用户上传的文件的数据,并在参数之前添加@RequestParam注解。

最后,调用参数对象的void transferTo(File dest)方法即可将用户上传的文件保存到服务器的硬盘中!

@RequestMapping("upload.do")
@ResponseBody
public String upload(
	@RequestParam("file") MultipartFile file) 
		throws IllegalStateException, IOException {
	System.out.println("UploadController.upload()");
	
	// 执行保存文件
	File dest = new File("F:/1/a.jpg");
	file.transferTo(dest);
	
	return "OK";
}

@RequestMapping("upload.do")
@ResponseBody
public String upload(@RequestParam("file") MultipartFile file,
		HttpServletRequest request) 
		throws IllegalStateException, IOException {
	System.out.println("UploadController.upload()");
	
	// 判断上传的文件是否为空
	boolean isEmpty = file.isEmpty();
	System.out.println("\tisEmpty=" + isEmpty);
	if (isEmpty) {
		throw new RuntimeException("上传失败!上传的文件为空!");
	}
	
	// 检查文件大小
	long fileSize = file.getSize();
	System.out.println("\tsize=" + fileSize);
	if (fileSize > 1 * 1024 * 1024) {
		throw new RuntimeException("上传失败!上传的文件大小超出了限制!");
	}
	
	// 检查文件MIME类型
	String contentType = file.getContentType();
	System.out.println("\tcontentType=" + contentType);
	List<String> types = new ArrayList<String>();
	types.add("image/jpeg");
	types.add("image/png");
	types.add("image/gif");
	if (!types.contains(contentType)) {
		throw new RuntimeException("上传失败!不允许上传此类型的文件!");
	}
	
	// 准备文件夹
	String parentDir = request.getServletContext().getRealPath("upload");
	// request.getSession().getServletContext().getRealPath("");
	// request.getRealPath("");
	System.out.println("\tpath=" + parentDir);
	File parent = new File(parentDir);
	if (!parent.exists()) {
		parent.mkdirs();
	}
	
	// 获取原始文件名
	String originalFilename = file.getOriginalFilename();
	System.out.println("\toriginalFilename=" + originalFilename);
	
	// 确定最终保存时使用的文件
	String filename = UUID.randomUUID().toString();
	String suffix = "";
	int beginIndex = originalFilename.lastIndexOf(".");
	if (beginIndex != -1) {
		suffix = originalFilename.substring(beginIndex);
	}
	
	// 执行保存文件
	File dest = new File(parent, filename + suffix);
	file.transferTo(dest);
	
	return "OK";
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值