關於上傳文件時,後臺用request.getParameter()獲取不到表單裏的其它參數值的問題

如今咱們作項目,像文件上傳,表單提交,後臺框架能夠用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);

    }
相關文章
相關標籤/搜索