本篇文章給大家分享的是有關(guān)利用Spring MVC怎么實(shí)現(xiàn)一個(gè)文件上傳功能,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話(huà)不多說(shuō),跟著小編一起來(lái)看看吧。
創(chuàng)新互聯(lián)成立與2013年,先為祥符等服務(wù)建站,祥符等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢(xún)服務(wù)。為祥符企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。
1、使用Spring MVC 上傳文件必須配置文件解析器,如下:
2、建立上傳文件表單代碼,其中要注意form表單中的enctype 屬性,必須存在且必須為multipart/form-data。還有當(dāng)form中存在button標(biāo)簽時(shí),用ajax異步提交表單后,也面會(huì)被刷新。原因:button 存在時(shí)會(huì)再次提交一下表單,所以頁(yè)面被刷新了。
3.1、使用CommonsMultipartFile接收上傳文件,其中要注意的是:方法中CommonsMultipartFile對(duì)應(yīng)的變量名如果不是對(duì)應(yīng)表單中文件輸入框的名稱(chēng)就必須加上@RequestParam("txtFile") 強(qiáng)制注入。
/** * @Description: 通過(guò)文件流的形式上傳 * @param file @RequestParam("txtFile") 將name=txtFile控件得到的文件封裝成CommonsMultipartFile對(duì)象, * 如果不這樣做會(huì)報(bào)CommonsMultipartFile沒(méi)有初始化的錯(cuò)誤 * java.lang.NoSuchMethodException: org.springframework.web.multipart.commons.CommonsMultipartFile.() * @return * @author yuanfy * @date 2017年9月15日 下午4:36:11 * @version 6.5 */ @RequestMapping(value="test/upload1") @ResponseBody public String testUpload1(@RequestParam("txtFile")CommonsMultipartFile file){ Long times = System.currentTimeMillis(); if (file == null) { return null; } StringBuilder fileContent = new StringBuilder(); //1、獲取文件信息 FileUtils.getFileInfo(file, fileContent); //2、上傳文件并獲取文件內(nèi)容 try { file.transferTo(new File("F:\\text.log"));//另存文件 fileContent.append(FileUtils.getFileContentByLine(file.getInputStream())); } catch (IOException e) { return "獲取文件內(nèi)容失敗"; } //3、返回文件信息和內(nèi)容 String content = fileContent.toString(); content = content.replace("times", (System.currentTimeMillis()-times) + "ms"); return content; }
界面效果圖如下:
3.2、使用CommonsMultipartResolver獲取存放文件對(duì)象,拿到文件對(duì)象后遍歷每個(gè)文件上傳及獲取相關(guān)的內(nèi)容。
@RequestMapping(value="test/upload2") @ResponseBody public String testUpload2(HttpServletRequest request){ Long times = System.currentTimeMillis(); StringBuilder fileContent = new StringBuilder(); //1.根據(jù)servletContext獲取多文件上傳解析組件 CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext()); if (!multipartResolver.isMultipart(request)) { return "不是上傳文件表單,請(qǐng)檢查表單屬性"; } //2.將請(qǐng)求對(duì)象轉(zhuǎn)換為多文件請(qǐng)求對(duì)象。 MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request; //3、根據(jù)多文件請(qǐng)求對(duì)象獲取文件存放Map MapfileMap = multipartHttpServletRequest.getFileMap(); Iterator > iterator = fileMap.entrySet().iterator(); //4、迭代文件Map,獲取具體的MultipartFile while (iterator.hasNext()) { Entry entry = iterator.next(); MultipartFile multipartFile = entry.getValue(); //獲取文件頭信息 FileUtils.getFileInfo(multipartFile, fileContent); try { //上傳文件 multipartFile.transferTo(new File("F:\\text.log")); //獲取文件內(nèi)容 fileContent.append(FileUtils.getFileContentByLine(multipartFile.getInputStream())); }catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } //5、返回文件信息和內(nèi)容 String content = fileContent.toString(); content = content.replace("times", (System.currentTimeMillis()-times) + "ms"); return content; }
其中第一步獲取文件解析器對(duì)象應(yīng)該都清楚只要在容器中配置了對(duì)應(yīng)的對(duì)象我們就可以獲取到它,而它有根據(jù)上下文獲取的構(gòu)造函數(shù)就方便多了。
/** * Constructor for standalone usage. Determines the servlet container's * temporary directory via the given ServletContext. * @param servletContext the ServletContext to use */ public CommonsMultipartResolver(ServletContext servletContext) { this(); setServletContext(servletContext); }
然后根據(jù)request判斷是否還有上傳文件的表單,如果不是肯定直接返回,我們看看源碼中是怎么判斷的。
//CommonsMultipartResolver.class 主要判斷request是否為空 @Override public boolean isMultipart(HttpServletRequest request) { return (request != null && ServletFileUpload.isMultipartContent(request)); } //ServletFileUpload 主要判斷是否是post方法,因?yàn)樯蟼魑募仨毷莗ost提交,其實(shí)我們可以在我們自定義controller中的方法指定訪(fǎng)問(wèn) public static final boolean isMultipartContent(HttpServletRequest request) { if (!POST_METHOD.equalsIgnoreCase(request.getMethod())) { return false; } return FileUploadBase.isMultipartContent(new ServletRequestContext(request)); } //FileUploadBase.class 如果請(qǐng)求是MULTIPART 則返回true public static final boolean isMultipartContent(RequestContext ctx) { String contentType = ctx.getContentType();//類(lèi)似:multipart/form-data; boundary=----WebKitFormBoundaryLF3eM94lDB0ocQxT if (contentType == null) { return false; } if (contentType.toLowerCase(Locale.ENGLISH).startsWith(MULTIPART)) { return true; } return false; }
所以如果request是上傳文件的請(qǐng)求對(duì)象,則進(jìn)行第二步。將request轉(zhuǎn)換成多文件請(qǐng)求對(duì)象,然后獲取存放文件的map。
可想而知這種方法效率是比第一種要低的,因?yàn)樗闅v文件map,但是在Spring MVC常用的卻是這種方法。
效果圖如下:
其中FileUtils.java代碼如下:
package com.yuanfy.monitorsite.common.util; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import org.springframework.web.multipart.MultipartFile; /** * @Description: 文件工具類(lèi)方法 * @author yuanfy * @date 2017年9月15日 下午2:45:40 * @version 1.0 */ public class FileUtils { /** * @Description: 獲取文件信息 * @param file CommonsMultipartFile類(lèi)型的文件 * @param fileContent StringBuilder,封裝文件信息 * @author yuanfy * @date 2017年9月15日 下午2:51:34 * @version 1.0 */ public static void getFileInfo(MultipartFile file, StringBuilder fileContent) { fileContent.append("文件名稱(chēng):\t\t").append(file.getName()).append("\n") .append("文件原始名稱(chēng):\t").append(file.getOriginalFilename()).append("\n") .append("文件大小:\t\t").append(file.getSize()).append("\n") .append("文件類(lèi)型:\t\t").append(file.getContentType()).append("\n") .append("讀取文件時(shí)長(zhǎng):\t times").append("\n"); } /** * @Description: 根據(jù)文件對(duì)象獲取文件內(nèi)容 * @param file * @author yuanfy * @date 2017年9月15日 下午5:01:57 * @version 1.0 * @throws IOException * @throws FileNotFoundException */ public static String getFileContentByLine(File file) throws FileNotFoundException, IOException { return getFileContentByLine(new FileInputStream(file)); } /** * @Description: 根據(jù)文件輸入流對(duì)象獲取文件內(nèi)容 * @param in 文件輸入流對(duì)象 * @author yuanfy * @date 2017年9月15日 下午5:01:57 * @version 1.0 * @throws IOException */ public static String getFileContentByLine(InputStream in) throws IOException { StringBuilder fileContent = new StringBuilder(); byte[] bytes = new byte[1024]; int len = 0; while ((len = in.read(bytes)) != -1) { String content = new String(bytes, 0, len, "UTF-8"); fileContent.append(content); } StreamUtils.close(in); return fileContent.toString(); } }
以上就是利用Spring MVC怎么實(shí)現(xiàn)一個(gè)文件上傳功能,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。