最近在做一個從客戶端上傳文件,服務器得到文件流,加密,並得到字符串存入數據庫,由於對java文件的操作甚少,經過幾番折騰,終於搞定,特意拿出來分享。
上傳采用的是Commons FileUpload,Commons FileUpload上傳需要兩個jar包,分別是commons-fileupload-1.2.2.jar和commons-io-2.3.jar
Commons FileUpload提供三種文件上傳處理方式,DiskFileUpload、ServletFileUpload和PortletFileUpload三種方式,其中DiskFileUpload已經在javadoc下已經被標記為過期的方法,建議用ServletFileUpload代替,而PortletFileUpload需要配合portlet-api來使用,所以這里我使用的是ServletFileUpload,並且這個也是最常用的。
1.首先用到Html的input標簽,type為file
< form action ="UploadServlet" enctype= "multipart/form-data" method ="post" > < input type ="file" name= "filecer" id= "filecer" > < input type ="text" name= "name"> < input type ="submit" value= "上傳"> </form >
注意:form表單的enctype= "multipart/form-data" method ="post"
2.創建一個servlet,用來處理提交表單數據。servlet-name為:UploadServlet,並創建service方法,方法如下:
//檢查輸入請求是否為 multipart表單數據 boolean isMultipart = ServletFileUpload.isMultipartContent(request); try { if (isMultipart == true) { //為該請求創建一個DiskFileItemFactory對象,通過它來解析請求 FileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); //將所有的表單項目都保存到List中 List<FileItem> items = upload.parseRequest(request); Iterator<FileItem> itr = items.iterator(); //循環list,取得表單項 while (itr.hasNext()) { FileItem item = (FileItem) itr.next(); //檢查當前項目是普通表單項目還是文件。 if (item.isFormField()) {//如果是普通表單項目,顯示表單內容。 String fieldName = item.getFieldName(); if (fieldName.equals("name" )){ //對應form表單中type="text" name="name" System. out .println("the field name is" + item.getString()); //顯示表單內容 } } else {//如果是文件 if (item.getFieldName().equals("filecer" )){ //如果上傳文件的file的name為" filecer" InputStream inStream = item.getInputStream(); ByteArrayOutputStream out = new ByteArrayOutputStream(); int ch; String res = "" ; while ((ch = inStream.read()) != -1) { out.write(ch); } byte [] result = out.toByteArray(); res = Base64.byteArrayToBase64(result); System. out .println(res); System. out .print("the upload file name is" + item.getName()); } } } } else { System. out .println("the enctype must be multipart/form-data"); } } catch (FileUploadException e) { e.printStackTrace(); }
3.運行后,上傳文件,即可從控制台輸出加密后的文件字符串
最后附上源碼:點擊下載