使用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; }
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- 基於SSM 集成 Freemarker模板引擎的方法
- SpringMVC註解的入門實例詳解
- 關於springmvc報錯404的問題
- Spring MVC整合FreeMarker的示例
- SpringMVC RESTFul實戰案例訪問首頁