我們在寫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 字節輸出流,就可以獲取內容。