form表單的enctype屬性指明在將數據發送給服務器以前使用何種方式對將要發送的數據編碼。html
application/x-www-form-urlencoded 是默認的編碼方式java
multipart/form-data 不對字符編碼ajax
text/plain 空格轉換爲 "+" 加號,但不對特殊字符編碼瀏覽器
以這種格式提交數據時,瀏覽器會將字符串和文件看成一整個字節流發送到服務器服務器
經過特定的標記分隔開app
不一樣的input之間的數據有一個分隔符,此分割符不是固定的,請求頭包含該分隔符的信息異步
一個input框中的數據,會以 ‘\r\n’分隔,若是input是text類型的,其中會包含name和具體的值工具
若是是file類型的會包含filename,文件格式的信息,以後就是文件的字節流信息;post
混合表單提交是post提交演變而來的,參考博客https://www.cnblogs.com/tylerdonet/p/5722858.html編碼
參考:http://blog.csdn.net/Chengyajie521/article/details/40888903
經過request對象的getInputStream()方法獲取數據流,以multipart/form-data格式提交的數據是沒法直接使用getParameter()方法獲取字符串參數的,除非已經使用其餘工具對request解析過了,使用getParameter()方法成功後,也就沒法經過getInputStream()獲取數據流了。
InputStream.read()方法的返回類型是int,該方法一次讀取一個字節,Java中
byte佔一個字節,有正負,範圍是[-12八、127]
short佔二個字節
char佔二個字節,Java使用Unicode編碼
int佔四個字節
long佔八個字節
而InputStream.read()方法返回的是一個unsigned byte [0 - 255],沒法用byte接收
在http://blog.csdn.net/Chengyajie521/article/details/40888903中的方法,沒法讀取中文文件名,
因該使用UTF-8的編碼去解析字符串
//使用commons-fileupload組件 //需引入commons-fileupload.jar和commons-io.jar //判斷是否包含文件 ServletFileUpload.isMultipartContent(request); // 配置上傳參數 DiskFileItemFactory factory = new DiskFileItemFactory(); // 設置內存臨界值 - 超事後將產生臨時文件並存儲於臨時目錄中 factory.setSizeThreshold(MEMORY_THRESHOLD); // 設置臨時存儲目錄 factory.setRepository(new File(System.getProperty("java.io.tmpdir"))); ServletFileUpload upload = new ServletFileUpload(factory); // 設置最大文件上傳值 upload.setFileSizeMax(MAX_FILE_SIZE); // 設置最大請求值 (包含文件和表單數據) upload.setSizeMax(MAX_REQUEST_SIZE); // 中文處理 upload.setHeaderEncoding("UTF-8"); //獲取request中的文件 List<FileItem> formItems = upload.parseRequest(request);
//將request轉換成MultipartHttpServletRequest //前提是必須是以混合表單形式提交,不然報錯 //form表單設置屬性enctype="multipart/form-data" //異步提交可以使用jQuery.form.js的ajaxSubmit()方法 MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; Iterator fileNames = multipartRequest.getFileNames();//能夠上傳一張也能夠上傳多張圖片 //遍歷獲取文件 for (int i = 0; fileNames.hasNext(); ++i) { //form表單input標籤name屬性,表單中file框的name屬性不能少,不然此處報錯 String name = (String) fileNames.next(); MultipartFile myfile = multipartRequest.getFile(name); //原文件名 String OriginalFileName = myfile.getOriginalFilename(); //判斷文件是否爲空 myfile.isEmpty(); //獲取輸入流 myfile.getInputStream(); }
SpringMVC文件上傳注意事項:表單中file框的name屬性不能少
判斷request是不是MultipartHttpServletRequest
// 建立一個通用的多部分解析器. CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext()); // 設置編碼 commonsMultipartResolver.setDefaultEncoding("utf-8"); // 判斷是否有文件上傳 if (commonsMultipartResolver.isMultipart(request)) {//有文件上傳 //將request變成多部分request MultipartHttpServletRequest multiRequest=(MultipartHttpServletRequest)request; //獲取multiRequest 中全部的文件名 Iterator<String> iter=multiRequest.getFileNames(); while (iter.hasNext()) { MultipartFile imageFile = multiRequest.getFile(iter.next().toString()); }