最近在做一个从客户端上传文件,服务器得到文件流,加密,并得到字符串存入数据库,由于对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.运行后,上传文件,即可从控制台输出加密后的文件字符串