SpringMVC系列(四)注解方式上传文件

本文主要介绍SpringMVC上传文件的两种方式

第二种较第一种而言,采用了解析器,大大提高了上传的效率。

第一种:

步骤:

1、引入jar包

2、配置spring-servlet.xml文件

   <!-- SpringMVC上传文件时,需要配置MultipartResolver处理器 -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="defaultEncoding" value="UTF-8"/>
        <!-- 指定所上传文件的总大小不能超过200KB。注意maxUploadSize属性的限制不是针对单个文件,而是所有文件的容量之和 -->
        <property name="maxUploadSize" value="200000"/>
        <property name="defaultEncoding" value="utf-8" />
         <property name="maxInMemorySize" value="40960" />
    </bean>  

    <!-- SpringMVC在超出上传文件限制时,会抛出org.springframework.web.multipart.MaxUploadSizeExceededException -->
    <!-- 该异常是SpringMVC在检查上传的文件信息时抛出来的,而且此时还没有进入到Controller方法中 -->
    <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
            <props>
                <!-- 遇到MaxUploadSizeExceededException异常时,自动跳转到/WEB-INF/jsp/error_fileupload.jsp页面 -->
                <prop key="org.springframework.web.multipart.MaxUploadSizeExceededException">error_fileupload</prop>
            </props>
        </property>
    </bean>

3、写jsp

文件上传方式,必须要采用POST!

设置表单的编码方式,必须为enctype="multipart/form-data">

<h>上传</h>
<form name="userForm" action="/springMVC7/file/upload" method="post" enctype="multipart/form-data">
        选择文件:<input type="file" name="filename">
        <input type="submit" value="提交">
</form> 

4、写Controller

利用springMVC封装好的上传文件的方法,用注解的方式拿到JSP中的文件。(@RequestParam("filename")

@Controller
@RequestMapping("/file")
public class index {

	@RequestMapping(value = "/upload1")
	public String addUser(@RequestParam("filename") CommonsMultipartFile file,
			HttpServletRequest request) throws IOException {

		if (!file.isEmpty()) {
			try {
				// 拿到输出流,同时重命名上传的文件
				FileOutputStream os = new FileOutputStream("D:/" + new Date().getTime()
						+ file.getOriginalFilename());
				// 拿到上传文件的输入流
				InputStream in = file.getInputStream();
				// 以写字节的方式写文件
				int b = 0;
				while ((b = in.read()) != -1) {
					os.write(b);
				}
				os.flush();
				os.close();
				in.close();
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			}
		}

		return "success";
	}

第二种:优化上传文件

思路:使用解析器,大大提高了上传速度

与方法一的区别仅在于Controller

@RequestMapping("/upload2")
public String upload2(HttpServletRequest request, HttpServletResponse response)
		throws IllegalStateException, IOException {
	// 创建一个通用的多部分解析器 ,用于解析SpringMVC的上下文
	CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request
			.getSession().getServletContext());
	// 解析request,判断是否为MultipartFile类型数据,即多部分请求
	if (multipartResolver.isMultipart(request)) {
		// 转换成多部分request
		MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
		// 取得request中的所有文件名
		Iterator<String> iter = multiRequest.getFileNames();
		while (iter.hasNext()) {
			// 取得上传文件
			MultipartFile file = multiRequest.getFile(iter.next());
			if (file != null) {
				// 取得当前上传文件的文件名称
				String myFileName = file.getOriginalFilename();
				// 如果名称不为“”,说明该文件存在,否则说明该文件不存在
				if (myFileName.trim() != "") {
					// 重命名上传后的文件名
					String fileName = new Date().getTime()
							+ file.getOriginalFilename();
					/*
					 * //定义上传路径 String path = "H:/" + fileName; File
					 * localFile = new File(path); //
					 * 把文件拷贝到本地:transferTo(gest)将上传文件写到服务器指定文件上
					 * file.transferTo(localFile);
					 */

					// 如果用的是Tomcat服务器,则文件会上传到\\%TOMCAT_HOME%\\webapps\\YourWebProject\\WEB-INF\\upload\\文件夹中
					String realPath = request.getSession().getServletContext()
							.getRealPath("/WEB-INF/upload");
					// 不必处理IO流关闭的问题,因为FileUtils.copyInputStreamToFile()方法内部会自动把用到的IO流关掉
					FileUtils.copyInputStreamToFile(file.getInputStream(), new File(
							realPath, fileName));
				}
			}
		}
	}
	return "/success";
<span style="font-family:Microsoft YaHei;">}</span>

总结:

  本文主要介绍SpringMVC上传文件的两种方式。利用SpringMVC对上传文件封装的方法,做上传操作。

        第二种较第一种而言,采用了解析器,大大提高了上传的效率。

        当然,并不建议使用SpringMVC的上传方式,因为此时是将文件先上传到服务器后,才做验证!

        推荐使用前台JQuery等上传文件的方式,只需要在浏览器做验证即可,不需要提交服务器,更加提高传输效率。

时间: 2024-10-10 02:01:12

SpringMVC系列(四)注解方式上传文件的相关文章

android post方式上传文件(模拟表单格式数据提交)

表单提交内容为: POST /upload.php?zp_id=ab46ca6d703e3a1580c1c9b8b3a8fb39 HTTP/1.1Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/v

通过Ajax方式上传文件,使用FormData进行Ajax请求

通过传统的form表单提交的方式上传文件: 1 2 3 4 5 6 7 8 9 <form id= "uploadForm" action= "http://localhost:8080/cfJAX_RS/rest/file/upload" method= "post" enctype ="multipart/form-data">       <h1 >测试通过Rest接口上传文件 </h1&g

Ajax方式上传文件

用到两个对象 第一个对象:FormData 第二个对象:XMLHttpRequest 目前新版的Firefox 与 Chrome 等支持HTML5的浏览器完美的支持这两个对象,但IE9尚未支持 FormData 对象,还在用IE6 ? 只能仰天长叹.... 有了这两个对象,我们可以真正的实现Ajax方式上传文件. 示例代码: <!DOCTYPE html> <html> <head> <title>Html5 Ajax 上传文件</title>

Android必知必会-使用okhttp的PUT方式上传文件

背景 公司的文件上传接口使用PUT协议,之前一直用的都是老项目中的上传类,现在项目中使用了okhttp网络库,就查了下资料,在这里分享一下. 代码实现 /** * @param mediaType MediaType * @param uploadUrl put请求地址 * @param localPath 本地文件路径 * @return 响应的结果 和 HTTP status code * @throws IOException */ public String put(MediaType

H5 通过Ajax方式上传文件,使用FormData进行Ajax请求

通过传统的form表单提交的方式上传文件: Html代码   <form id= "uploadForm" action= "http://localhost:8080/cfJAX_RS/rest/file/upload" method= "post" enctype ="multipart/form-data"> <h1 >测试通过Rest接口上传文件 </h1> <p >指定

php5.6之后的版本使用curl以@+文件名的方式上传文件无效的解决版本

使用curl上传文件使用[email protected]文件路径的方式,在php5.6以后的版本中无法使用了 官方文档给出明确解释 如果需要支持的话,可以将CURLOPT_SAFE_UPLOAD设置为false 或者使用CURLFile上传文件

FastDFS的配置、部署与API使用解读(2)以字节方式上传文件的客户端代码

1.下载FastDFS的API FastDFS提供Java和PHP等语言的客户端API.可以到FastDFS在Google Code的项目主页 http://code.google.com/p/fastdfs/downloads/list 下载.本文以Java API为例. 2.调用API的上传接口 通过Servlet得到InputStream.文件名称和文件长度,然后通过调用FastDFS提供的Java API把文件上传到FastDFS服务器.下段代码中的getFileBuffer可参考本博客

python使用post方式上传文件

前言:由于项目需求做的接口测试有上传文件这一要求,在查资料时候发现用requests来做上传文件很简单,所以下了这个库来完成.后续有时候会看看能不能用传统地urllib2来做. 首先你要有个requests: https://github.com/kennethreitz/requests 然后把它import进来 接着: def post(self,url,param_dict,param_header,file = '',param_type = 'x-www-form-urlencode'

Ajax方式上传文件报错&quot;Uncaught TypeError: Illegal invocation&quot;

今天使用ajax上传文件时,出现了错误.数据传输的方式是通过定义formData完成的,提交的文件对象也设置为dom对象,但是还是不能发送请求.F12看到后台报了个错误:Uncaught TypeError: Illegal invocation,百度了一下,找到了解决方法. 解决方法:在ajax请求的参数中添加如下两个参数: $.ajax({ ..., processData: false, contentType: false, ... }); processData 类型:Boolean