使用SpringMVC接收文件流上传和表单参数
作者:Zebe
这篇文章主要介绍了使用SpringMVC接收文件流上传和表单参数,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
接收文件流上传和表单参数
在SpringMVC中,接收文件流非常简单,我们可以写个接口用来接收一些文件,同时还可以接收表单参数。
代码参考如下:
JAVA服务端代码
/** * 接收文件流 * * @param request 请求 * @return OK */ @RequestMapping(value = "/receive/file", method = POST) public String receiveFile(HttpServletRequest request) { // 转换为 MultipartHttpServletRequest if (request instanceof MultipartHttpServletRequest) { MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; // 通过表单中的参数名来接收文件流(可用 file.getInputStream() 来接收输入流) MultipartFile file = multipartRequest.getFile("file"); System.out.println("上传的文件名称:" + file.getOriginalFilename()); System.out.println("上传的文件大小:" + file.getSize()); // 接收其他表单参数 String name = multipartRequest.getParameter("name"); String content = multipartRequest.getParameter("content"); System.out.println("name:" + name); System.out.println("content:" + content); return "OK"; } else { return "不是 MultipartHttpServletRequest"; } }
HTML页面代码
<form action="http://127.0.0.1:8080/receive/file" method="post" enctype="multipart/form-data"> <input type="file" name="file" id="file"> <input type="text" name="content" value="内容"> <input type="text" name="name" value="名称"> <button type="submit">提交请求</button> </form>
SpringMVC接收文件上传,并对文件做处理
- http client版本4.1.1
- spring版本3.2.11
在这个例子里面我接收了文件,并转发给另一个机器,其实接收的时候文件的流已经拿到了,想保存到本地,或者对文件分析,自己可以斟酌。
springmvc配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <context:component-scan base-package="com"/> <!-- if you use annotation you must configure following setting --> <mvc:annotation-driven/> <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/> <!-- 处理JSON --> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> </list> </property> </bean> <mvc:default-servlet-handler/> <!-- 日志输出拦截器 --> <mvc:interceptors> <bean class="com.steward.interceptor.AccessInteceptor"> <property name="accessLog"> <value>true</value> </property> </bean> </mvc:interceptors> <!-- 解析器 --> <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> <property name="mediaTypes"> <map> <entry key="html" value="text/html"/> <entry key="json" value="application/json"/> </map> </property> <property name="viewResolvers"> <list> <ref bean="viewResolver"/> </list> </property> <property name="defaultViews"> <list> <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"/> </list> </property> </bean> <!-- 异常处理 --> <bean id="exceptionHandler" class="com.steward.exception.ExceptionHandler"/> <!-- 文件上传 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/> <!-- 配置freeMarker的模板路径 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"></property> <property name="suffix" value=".html"></property> <property name="contentType" value="text/html;charset=UTF-8"/> <property name="requestContextAttribute" value="rc"></property> </bean> <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> <property name="templateLoaderPath" value="/WEB-INF/templates/"></property> <property name="freemarkerSettings"> <props> <prop key="template_update_delay">0</prop> <prop key="default_encoding">UTF-8</prop> <prop key="locale">zh_CN</prop> <prop key="number_format">0.##########</prop> <prop key="template_exception_handler">ignore</prop> </props> </property> <property name="freemarkerVariables"> <map> <entry key="getVersion" value-ref="getVersion"/> </map> </property> </bean> <bean id="getVersion" class="com.steward.freemarker.GetVersion"/> </beans>
controller代码如下
@RequestMapping(value = "/uploadFile", method = RequestMethod.POST) @ResponseBody public String uploadFile(HttpServletRequest request) throws Exception { FileOutputStream fos = null; InputStream in = null; String fileUrl = null; try { //将当前上下文初始化给 CommonsMutipartResolver (多部分解析器) CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext()); //检查form中是否有enctype="multipart/form-data" if (multipartResolver.isMultipart(request)) { //将request变成多部分request MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request; //获取multiRequest 中所有的文件名 Iterator iterator = multiRequest.getFileNames(); while (iterator.hasNext()) { MultipartFile multipartFile = multiRequest.getFile(iterator.next().toString()); in = multipartFile.getInputStream(); File file = new File(multipartFile.getOriginalFilename()); fos = new FileOutputStream(file); byte[] buff = new byte[1024]; int len = 0; while ((len = in.read(buff)) > 0) { fos.write(buff, 0, len); } String uploadUrl = platformHttpsDomain + "/uploadFile"; HttpPost post = new HttpPost(uploadUrl); HttpClient httpclient = new DefaultHttpClient(); MultipartEntity reqEntity = new MultipartEntity(); reqEntity.addPart("file", new FileBody(file)); post.setEntity(reqEntity); HttpResponse response = httpclient.execute(post); int statusCode = response.getStatusLine().getStatusCode(); if (statusCode == HttpStatus.SC_OK) { fileUrl = EntityUtils.toString(response.getEntity()); } file.deleteOnExit(); } } } catch (Exception e) { e.printStackTrace(); } finally { if (fos != null) { try { fos.close(); } catch (IOException e) { } } if (in != null) { try { in.close(); } catch (IOException e) { } } } return fileUrl; }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。