關於上傳文件時,后台用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="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);

    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM