关于上传⽂件时,后台⽤Parameter()获取不到表单⾥的其它参数值
的问题
现在我们做项⽬,像⽂件上传,表单提交,后台框架可以⽤ssm,前台框架可以⽤easyui等,参数接收传递利⽤框架都是⾮常容易的,⼀般不会出现这种问题,今天主要描述的
是上传⽂件时,java后台利⽤Parameter()接收前台参数时,接收不到的问题。这个⽅法现在⽤的不多了,⽐较⽼。
情况是这样的,这⼏天做⽂件上传存到mongodb库⾥,但是发现上传⽂件的时候,上传⽂件可以成功。但是⽤Parameter()⽆法获取表单其他参数,很是懵。最后总结如下,⼀般表单提交有两种⽅式,get和post⽅式,在form中method属性⾥填写post或者get。默认是get⽅式。
表单提交中get和post⽅式的区别有5点:
<是从服务器上获取数据,post是向服务器传送数据。
<是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段⼀⼀对应,在URL中可以看到。post是通过HTTPpost机制,将表单内各个字段与其内
容放置在HTML HEADER内⼀起传送到ACTION属性所指的URL地址。⽤户看不到这个过程。
3.对于get⽅式,服务器端⽤Request.QueryString获取变量的值,对于post⽅式,服务器端⽤Request.Form获取提交的数据。
<传送的数据量较⼩,不能⼤于2KB。post传送的数据量较⼤,⼀般被默认为不受限制。但理论上,IIS4中最⼤量为80KB,IIS5中为100KB。
<相对安全性⾮常低,post相对安全性较⾼。
在form中的enctype的属性⼀般有以下三种:
⼀、application/x-www-form-urlencoded:
1、表单中的enctype值如果不设置,则默认是application/x-www-form-urlencoded,它会将表单中的数据变为键值对
的形式
2、如果action为get,则将表单数据编码为(name1=value1&name2=value2…),然后把这个字符串加到url后⾯,中间
⽤?分隔
3、如果action为post,浏览器把form数据封装到http body中,然后发送到服务器。
⼆、text/plain:
表单以纯⽂本形式进⾏编码
三、multipart/form-data:
1、当我们上传的含有⾮⽂本内容,即含有⽂件(txt、MP3等)的时候,需要将form的enctype设置为multipart/form-
data。
2、将表单中的数据变成⼆进制数据进⾏上传,所以这时候这时如果⽤request是⽆法直接获取到相应表单的值的。
也就是说,我们上传⽂件的时候,需要将enctype的属性设置为multipart/form-data,⽽且method传输⽅式必须为post⽅式。⽽这样做,后台Parameter()是获取不到参数的,这不是错,这是正常的。
确实是没有办法获取的,⽽我们⼜确实⾮常急切的想要前台的参数值,我们可以改变⼀下思路来获取。⾸先,在form表单中设置⼀个onsubmit提交事件,onsubmit 事件会在表单中的确认按钮被点击时发⽣。
onsubmit="return validForm(this)"
然后,在表单中设置⼀个隐藏的input框。
前台代码:
<form id="fileUpload" name="upload" action="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" >选择⽂件<div ><input type="file" name="upload"></div></button <input name="ssmid" id="ssmid" type="hidden">
<div ><button type="submit" class="btn btn-primary btn-large">提交</button></div>
</form>
<!--隐藏框可以放到form表单外⾯-->
<input id="sbtzcollect" type="hidden">
</input>
inputtypefile不上传文件接着,我们在JS中的validFom事件中编写,获取⼀下要传递的参数值。将值追加到form表单的action属性⾥。也就是说,我们⾸先将我们的参数值存到页⾯隐藏的input框,然后提交的时候触发form的onsubmit⽅法,将值接着传到form表单⾥的action属性⾥⾯。让form访问后台的时候,带着参数值到后台。
这样,我们在后台⽤Parameter()就可以获取到了。顺便说⼀句,这样⽅式传输参数的话,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 = Parameter("sbtzname");
// 从前台值获取ssmid值
String ssmid = Parameter("ssmid");
// mongodb数据库名
String mongodbname = "filecollection";
// 查询collection表⾥有⽆ssmid关联的数据
ApplicationContext ctx = new ClassPathXmlApplicationContext("l");
carDataService = (CarDataService) Bean("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 = listdata(mapdbCollection);
// 查询到的所有collection档案表
lstResult = listdata(mapdbCollection, whereClause);// 所有collection档案表
// 进⾏判断,如果库⾥有ssmid关联的数据,进⼀步进⾏判断
if (lstResult.size() != 0) {
// 拿到已有ssmid数据值得档案名字
String collectionname = (String) (0).get("filename");
/
/ 想办法拿到上传⽂件的新名字
// 存储⽂件
String fileName = "";
Mongo mongo = new Mongo();
DB db = DB(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 = FileName();
InputStream in = InputStream();
pot = fileName.lastIndexOf(".");
file = ateFile(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) Bean("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 = DB(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 = FileName();
InputStream in = InputStream();
pot = fileName.lastIndexOf(".");
file = ateFile(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) Bean("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", "上传成功!");
// 返回界⾯
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论