如今咱們作項目,像文件上傳,表單提交,後臺框架能夠用ssm,前臺框架能夠用easyui等,參數接收傳遞利用框架都是很是容易的,通常不會出現這種問題,今天主要描述的是上傳文件時,java後臺利用request.getParameter()接收前臺參數時,接收不到的問題。這個方法如今用的很少了,比較老。java
狀況是這樣的,這幾天作文件上傳存到mongodb庫裏,可是發現上傳文件的時候,上傳文件能夠成功。可是用request.getParameter()沒法獲取表單其餘參數,非常懵。最後總結以下,通常表單提交有兩種方式,get和post方式,在form中method屬性裏填寫post或者get。默認是get方式。mongodb
表單提交中get和post方式的區別有5點 :
1.get是從服務器上獲取數據,post是向服務器傳送數據。
2.get是把參數數據隊列加到提交表單的ACTION屬性所指的URL中,值和表單內各個字段一一對應,在URL中能夠看到。post是經過HTTPpost機制,將表單內各個字段與其內容放置在HTML HEADER內一塊兒傳送到ACTION屬性所指的URL地址。用戶看不到這個過程。
3.對於get方式,服務器端用Request.QueryString獲取變量的值,對於post方式,服務器端用Request.Form獲取提交的數據。
4.get傳送的數據量較小,不能大於2KB。post傳送的數據量較大,通常被默認爲不受限制。但理論上,IIS4中最大量爲80KB,IIS5中爲100KB。
5.get相對安全性很是低,post相對安全性較高。數據庫
在form中的enctype的屬性通常有如下三種:瀏覽器
1、application/x-www-form-urlencoded:安全
一、表單中的enctype值若是不設置,則默認是application/x-www-form-urlencoded,它會將表單中的數據變爲鍵值對服務器
的形式app
二、若是action爲get,則將表單數據編碼爲(name1=value1&name2=value2…),而後把這個字符串加到url後面,中間框架
用?分隔jsp
三、若是action爲post,瀏覽器把form數據封裝到http body中,而後發送到服務器。函數
2、text/plain:
表單以純文本形式進行編碼
3、multipart/form-data:
一、當咱們上傳的含有非文本內容,即含有文件(txt、MP3等)的時候,須要將form的enctype設置爲multipart/form-
data。
二、將表單中的數據變成二進制數據進行上傳,因此這時候這時若是用request是沒法直接獲取到相應表單的值的。
也就是說,咱們上傳文件的時候,須要將enctype的屬性設置爲multipart/form-data,並且method傳輸方式必須爲post方式。而這樣作,後臺request.getParameter()是獲取不到參數的,這不是錯,這是正常的。確實是沒有辦法獲取的,而咱們又確實很是急切的想要前臺的參數值,咱們能夠改變一下思路來獲取。首先,在form表單中設置一個onsubmit提交事件,onsubmit 事件會在表單中的確認按鈕被點擊時發生。
onsubmit="return validForm(this)"
而後,在表單中設置一個隱藏的input框。
前臺代碼:
<form id="fileUpload" name="upload" action="http://127.0.0.1:8088/idif/upload.do" method="post" enctype="multipart/form-data" onsubmit="return validForm(this)"> <button type="button" class="upload btn btn-primary btn-large" style="width:100px;height:35px;">選擇文件<div style="margin-top:-30px;margin-left:-200px;opacity:0"><input type="file" name="upload"></div></button <input name="ssmid" id="ssmid" type="hidden"> <div style="margin-top: 10px;"><button type="submit" class="btn btn-primary btn-large" >提交</button></div> </form> <!--隱藏框能夠放到form表單外面--> <input id="sbtzcollect" type="hidden" > </input>
接着,咱們在JS中的validFom事件中編寫,獲取一下要傳遞的參數值。將值追加到form表單的action屬性裏。也就是說,咱們首先將咱們的參數值存到頁面隱藏的input框,而後提交的時候觸發form的onsubmit方法,將值接着傳到form表單裏的action屬性裏面。讓form訪問後臺的時候,帶着參數值到後臺。
這樣,咱們在後臺用request.getParameter()就能夠獲取到了。順便說一句,這樣方式傳輸參數的話,input框不用必須放到form表單裏,能夠放到頁面隨意位置,由於它的做用只是獲取值,將值傳給action屬性,而不是隨着form的提交,在後臺獲取這個隱藏的input框的值。若是傳遞一個參數,只須要?+參數名便可,若是多個參數,後面用&拼接起來便可。
JS代碼:
//文件上傳的時候傳遞參數 function validForm(fm){ debugger; var sbtzname =$("#sbtzcollect").val(); fm.action = fm.action + "?ssmid="+$("#ssmid").val()+"&sbtzname="+sbtzname; return true; }
這是一個驗證表單的功能。
當validForm()這個函數返回值是true的時候,表單提交,反之則不提交。
而this是一個參數,表明的當前表單對象~~~~。
函數有兩種定義方式function 和sub。function聲明的函數有返回值,用return語句返回這個值;而sub聲明的函數沒有返回值。
後臺代碼:
@RequestMapping(value = "upload", method = RequestMethod.POST) private void upload(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // 前臺獲取的設備臺帳名 String sbtzname = request.getParameter("sbtzname"); // 從前臺值獲取ssmid值 String ssmid = request.getParameter("ssmid"); // mongodb數據庫名 String mongodbname = "filecollection"; // 查詢collection表裏有無ssmid關聯的數據 ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); carDataService = (CarDataService) ctx.getBean("carDataService"); // 數據庫爲filecollection,collection名爲設備臺帳名 DBCollectionInfo mapdbCollection = new DBCollectionInfo(mongodbname, sbtzname); Map<String, Object> whereClause = new HashMap<String, Object>(); // 將前臺獲取的ssmid值放進去 whereClause.put("smid", ssmid); List<Map<String, Object>> lstResult = carDataService.getlistdata(mapdbCollection); // 查詢到的全部collection檔案表 lstResult = carDataService.getlistdata(mapdbCollection, whereClause);// 全部collection檔案表 // 進行判斷,若是庫裏有ssmid關聯的數據,進一步進行判斷 if (lstResult.size() != 0) { // 拿到已有ssmid數據值得檔案名字 String collectionname = (String) lstResult.get(0).get("filename"); // 想辦法拿到上傳文件的新名字 // 存儲文件 String fileName = ""; Mongo mongo = new Mongo(); DB db = mongo.getDB(mongodbname); GridFS gridFS = new GridFS(db, sbtzname); GridFSFile file = null; FileRenamePolicy rfrp = new DefaultFileRenamePolicy(); MultipartParser mp = new MultipartParser(request, 1024 * 1024 * 1024, true, true, "utf-8");// 「GB18030」必須和jsp編碼格式相同,否則會產生中文亂碼 FilePart filePart = null; Part part = null; int pot = 0; while ((part = mp.readNextPart()) != null) { if (part.isFile()) {// it's a file part filePart = (FilePart) part; filePart.setRenamePolicy(rfrp); // 獲取上傳文件名 fileName = filePart.getFileName(); InputStream in = filePart.getInputStream(); pot = fileName.lastIndexOf("."); file = gridFS.createFile(in);// 建立gridfs文件 file.put("filename", fileName); file.put("userId", 1); file.put("uploadDate", new Date()); file.put("contentType", fileName.substring(pot)); file.save(); } } // 得到新組合名字 String appendname = collectionname + fileName; // 將collection中原先此ssmid數據刪除 carDataService = (CarDataService) ctx.getBean("carDataService"); DBCollectionInfo collection0 = new DBCollectionInfo(mongodbname, sbtzname); Map<String, Object> mapData0 = new HashMap<String, Object>(); mapData0.put("smid", ssmid); // 刪除已有sid主鍵的記錄 carDataService.deletedata(collection0, mapData0); // 將新組合名字,添加到collection檔案表 Map<String, Object> mapData1 = new HashMap<String, Object>(); mapData1.put("smid", ssmid); mapData1.put("filename", appendname); carDataService.savecardata(collection0, mapData1); request.setAttribute("uploadResult", "上傳成功!"); } // 若是庫裏無此ssmid關聯的數據,直接執行存儲的代碼 try { // 存儲文件 String fileName = ""; Mongo mongo = new Mongo(); DB db = mongo.getDB(mongodbname); GridFS gridFS = new GridFS(db, sbtzname); GridFSFile file = null; FileRenamePolicy rfrp = new DefaultFileRenamePolicy(); MultipartParser mp = new MultipartParser(request, 1024 * 1024 * 1024, true, true, "utf-8");// 「GB18030」必須和jsp編碼格式相同,否則會產生中文亂碼 FilePart filePart = null; Part part = null; int pot = 0; while ((part = mp.readNextPart()) != null) { if (part.isFile()) {// it's a file part filePart = (FilePart) part; filePart.setRenamePolicy(rfrp); // 獲取上傳文件名 fileName = filePart.getFileName(); InputStream in = filePart.getInputStream(); pot = fileName.lastIndexOf("."); file = gridFS.createFile(in);// 建立gridfs文件 file.put("filename", fileName); file.put("userId", 1); file.put("uploadDate", new Date()); file.put("contentType", fileName.substring(pot)); file.save(); } } // 存儲collection檔案表 carDataService = (CarDataService) ctx.getBean("carDataService"); DBCollectionInfo collection1 = new DBCollectionInfo(mongodbname, sbtzname); Map<String, Object> mapData1 = new HashMap<String, Object>(); mapData1.put("smid", ssmid); mapData1.put("filename", fileName); carDataService.savecardata(collection1, mapData1); request.setAttribute("uploadResult", "上傳成功!"); } catch (Exception e) { e.printStackTrace(); request.setAttribute("uploadResult", "上傳失敗!"); } request.setAttribute("uploadResult", "上傳成功!"); // 返回界面 request.getRequestDispatcher("/uploadResult.jsp").forward(request, response); }