(轉)Spring文件上傳,包括一次選中多個文件
阿新 • • 發佈:2018-03-03
bmi while .html span cto input 獲取文件 dex asn
背景:
http://www.cnblogs.com/lixuwu/p/8495275.html已經實現了單文件的上傳和下載,多文件的上傳是另一種情景,這裏記錄下來
實現過程
先說前臺. 運行以後就是這樣子的. 一個非常簡單的表單頁面, 兩個文件上傳按鈕, 一個提交
其中單個文件上傳, 即只能選擇一個文件, 無法同時選擇多個
相對的, 多個文件就是可以同時選擇多個文件了
文件選擇以後就是這個樣子
前臺設置
代碼如下: 一個form, 文件上傳就是一個<input>輸入, 屬性type="file". 此時只能選擇單個文件. 而後面加一個multiple, 即可同時選擇多個文件
jsp頁面multiFile.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <form action="${pageContext.request.contextPath}/test/upload" enctype="multipart/form-data" method="post"> 單個文件: <input type="file" name="fileTest"><br/> 多個文件: <input type="file"name="fileList" multiple/></br/> <input type="submit" value="提交" /> </form> </body> </html>
spring中文件控制bean:
package spring.boot.uploadfile.config; import javax.servlet.MultipartConfigElement; import org.springframework.boot.web.servlet.MultipartConfigFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.ImportResource; /** * ClassName:ConfigClass <br/> * Function: TODO <br/> * Date: 2018年3月2日 下午8:20:05 <br/> * @author prd-lxw * @version 1.0 * @since JDK 1.7 * @see */ /** * classpath路徑:locations={"classpath:application-bean1.xml","classpath:application-bean2.xml"} * file路徑: locations = {"file:d:/test/application-bean1.xml"}; */ @Configuration @ImportResource(locations = { "classpath:spring-web.xml" }) //@ImportResource(locations={"file:d:/test/application-bean1.xml"}) public class ConfigClass { @Bean public MultipartConfigElement multipartConfigElement() { MultipartConfigFactory factory = new MultipartConfigFactory(); //文件最大 factory.setMaxFileSize("1000240KB"); //KB,MB /// 設置總上傳數據總大小 factory.setMaxRequestSize("102400KB"); return factory.createMultipartConfig(); } }
後臺代碼
Controller層代碼:
/** * Project Name:uploadfile * File Name:MutilFileUploadController.java * Package Name:spring.boot.uploadfile.controller * Date:2018年3月2日下午9:50:25 * Copyright (c) 2018, 深圳金融電子結算中心 All Rights Reserved. * */ package spring.boot.uploadfile.controller; import java.io.File; import java.io.IOException; import java.util.Iterator; import java.util.List; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; /** * ClassName:MutilFileUploadController <br/> * Function: TODO <br/> * Date: 2018年3月2日 下午9:50:25 <br/> * @author prd-lxw * @version 1.0 * @since JDK 1.7 * @see */ /** * 文件上傳測試類 */ @Controller @RequestMapping("/test") public class MutilFileUploadController { @RequestMapping("multi") public String multiIndex() { return "multiFile"; } @ResponseBody @RequestMapping(value = "upload") public void testUpload(MultipartHttpServletRequest request) throws IOException { /* * MultipartHttpServletRequest: 繼承於HttpServletRequest以及MultipartRequest. * 其中MultipartRequest中定義了相關的訪問操作. MultipartHttpServletRequest重寫 * 了HttpServletRequest中的方法, 並進行了擴展. 如果以HttpServletRequest來接收參 * 數, 則需要先將其轉為MultipartHttpServletRequest類型 * MultipartHttpServletRequest request = (MultipartHttpServletRequest) HttpServletRequest; */ /* * 再說回剛才的form, 假設我們在單個文件選框中上傳了文件1, 多個文件選框中上傳了文件2, 3, 4. * 那麽對於後臺接收到的, 可以這麽理解, 就是一個Map的形式(實際上它後臺真的是以Map來存儲的). * 這個Map的Key是什麽呢? 就是上面<input>標簽中的name=""屬性. Value則是我們剛才上傳的 * 文件, 通過下面的示例可以看出每一個Value就是一個包含對應文件集合的List * * 傳到後臺接收到的Map就是這樣: * fileTest: 文件1 * fileList: 文件2, 文件3, 文件4 * * 雖然從方法名的表面意義來看是得到文件名, 但實際上這個文件名跟上傳的文件本身並沒有什麽關系. * 剛才說了這個Map的Key就是<input>標簽中的name=""屬性, 所以得到的也就是這個屬性的值 */ Iterator<String> fileNames = request.getFileNames(); while (fileNames.hasNext()) { //把fileNames集合中的值打出來 String fileName = fileNames.next(); System.out.println("fileName: " + fileName); /* * request.getFiles(fileName)方法即通過fileName這個Key, 得到對應的文件 * 集合列表. 只是在這個Map中, 文件被包裝成MultipartFile類型 */ List<MultipartFile> fileList = request.getFiles(fileName); if (fileList.size() > 0) { //遍歷文件列表 Iterator<MultipartFile> fileIte = fileList.iterator(); while (fileIte.hasNext()) { //獲得每一個文件 MultipartFile multipartFile = fileIte.next(); //獲得原文件名 String originalFilename = multipartFile.getOriginalFilename(); System.out.println("originalFilename: " + originalFilename); //設置保存路徑. String path = "E:\\testJava\\filesss"; //檢查該路徑對應的目錄是否存在. 如果不存在則創建目錄 File dir = new File(path); if (!dir.exists()) { dir.mkdirs(); } String filePath = path + File.separator + originalFilename; System.out.println("filePath: " + filePath); //保存文件 File dest = new File(filePath); if (!(dest.exists())) { /* * MultipartFile提供了void transferTo(File dest)方法, * 將獲取到的文件以File形式傳輸至指定路徑. */ multipartFile.transferTo(dest); /* * 如果需對文件進行其他操作, MultipartFile也提供了 * InputStream getInputStream()方法獲取文件的輸入流 * * 例如下面的語句即為通過 * org.apache.commons.io.FileUtils提供的 * void copyInputStreamToFile(InputStream source, File destination) * 方法, 獲取輸入流後將其保存至指定路徑 */ //FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), dest); } //MultipartFile也提供了其他一些方法, 用來獲取文件的部分屬性 //獲取文件contentType String contentType = multipartFile.getContentType(); System.out.println("contentType: " + contentType); /* * 獲取name * 其實這個name跟上面提到的getFileName值是一樣的, * 就是Map中Key的值. 即前臺頁面<input>中name="" * 屬性. 但是上面的getFileName只是得到這個Map的Key, * 而Spring在處理上傳文件的時候會把這個值以name屬性 * 記錄到對應的每一個文件. 如果需要從文件層面獲取這個 * 值, 則可以使用該方法 */ String name = multipartFile.getName(); System.out.println("name: " + name); //獲取文件大小, 單位為字節 long size = multipartFile.getSize(); System.out.println("size: " + size); System.out.println("---------------------------------------------------"); } } } } }View Code
ps:上面的註釋很簡單,對照著實現就可以了
(轉)Spring文件上傳,包括一次選中多個文件