• 关于上传文件时,后台用request.getParameter()获取不到表单里的其它参数值的问题


    现在我们做项目,像文件上传,表单提交,后台框架可以用ssm,前台框架可以用easyui等,参数接收传递利用框架都是非常容易的,一般不会出现这种问题,今天主要描述的是上传文件时,java后台利用request.getParameter()接收前台参数时,接收不到的问题。这个方法现在用的不多了,比较老。

    情况是这样的,这几天做文件上传存到mongodb库里,但是发现上传文件的时候,上传文件可以成功。但是用request.getParameter()无法获取表单其他参数,很是懵。最后总结如下,一般表单提交有两种方式,get和post方式,在form中method属性里填写post或者get。默认是get方式。

    表单提交中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的属性一般有以下三种:

    一、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方式。而这样做,后台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="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);
    
        }
  • 相关阅读:
    JavaScript(16):横版菜单栏
    JavaScript(15):表格行之增删改
    JavaScript(14):实现jQuery的click绑定及链式编程
    c++ -- 左值和右值
    c++--模板与泛型编程
    python--导入其他文件夹下的模块(.py文件)
    python--pickle序列化(持久化)
    python--matplotlib显示中文问题(四种方法)
    machine learning--L1 ,L2 norm
    python--'__main__'的作用
  • 原文地址:https://www.cnblogs.com/wanlige/p/12509223.html
Copyright © 2020-2023  润新知