如今咱们作项目,像文件上传,表单提交,后台框架能够用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); }