表單Content-Type為multipart/form-data時,后台數據的接收


我們在寫form提交表單的時候,后台大多數用request.getParameter的方式來接收前台輸入的數據。但如果我們表單中提交的數據包含file文件傳輸的話,我們需要將Content-Type改為multipart/form-data。這時后台就不能再通過request.getParameter來獲取表單的內容了。就需要通過request的輸入流request.getInputStream來獲取表單內容了。這里記錄一種獲取表單內容的方式,這種方式既可以獲得表單的文本數據也可以獲取圖片的字節流

try {
                String serverRealPath = request.getSession().getServletContext().getRealPath("/");
                String path=serverRealPath+"saveImg";//文件保存路徑
                DiskFileItemFactory disk=new DiskFileItemFactory();
                ServletFileUpload sfu=new ServletFileUpload(disk);
                try {
                    List<FileItem> list=sfu.parseRequest(request);
                    for(FileItem file:list){
                        String fileName=file.getName();
                        if(fileName==null || "".equals(fileName)){
                            DataInputStream dataStream = new DataInputStream(
                                    file.getInputStream());
                            ByteArrayOutputStream output = new ByteArrayOutputStream();
                            byte[] bytes = new byte[1024];
                            int n = 0;
                            while((n=dataStream.read(bytes))!= -1){
                                output.write(bytes, 0, n);
                            }
                            byte[] newbytes = output.toByteArray();
                            name = new String(newbytes,"UTF-8");
                            
                        }else{
                            LOGGER.info("進入文件上傳方法");
                            fileName=fileName.substring(fileName.lastIndexOf("\\")+1);
                            String extName=fileName.substring(fileName.lastIndexOf("."));//獲取擴展.xxx
                            String newName=tarr_id+extName;//新名稱
                            InputStream is = file.getInputStream();// 獲取fileItem中的上傳文件的輸入流
                            FileOutputStream fos = new FileOutputStream(path+ File.separator + newName);// 創建一個文件輸出流
                            byte buffer[] = new byte[1024];// 創建一個緩沖區
                            int length = 0;// 判斷輸入流中的數據是否已經讀完的標識
                            while ((length = is.read(buffer)) > 0) {// 循環將輸入流讀入到緩沖區當中,(len=in.read(buffer))>0就表示in里面還有數據
                                fos.write(buffer, 0, length);// 使用FileOutputStream輸出流將緩沖區的數據寫入到指定的目錄(savePath + "\\" +filename)當中
                            }
                            //按照id生存新的文件名稱
                            filePath=newName;
                            LOGGER.info("file1_path的值為:"+newName);
                            is.close();// 關閉輸入流
                            fos.close();// 關閉輸出流
                            file.delete();// 刪除處理文件上傳時生成的臨時文件
                        }
                        
                    }
                } catch (Exception e) {
                    LOGGER.error("文件讀取失敗!");
                    e.printStackTrace();
                }
            } catch (Exception e) {
                LOGGER.error("文件上傳失敗!");
                e.printStackTrace();
            }

這里可以將request內容轉為一個FileItem的list,然后可以遍歷這個list來獲取表單的內容,如果其中包含文件的話,file.getName是可以獲取文件名的,如果getName的值為空的話,就說明這個不是文件。然后可以通過file.getInputStream獲取其輸入流,然后將其輸出成ByteArrayOutputStream 字節輸出流,就可以獲取內容。


免責聲明!

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



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