form表单属性为enctype="multipart/form-data"时,如果获取表单普通域的值
在做jsp页面开发的时候,难免会遇上需要做文件上传的功能,这个时候form表单的enctype属性就只能设置为multipart/form-data,而且method也必须设置为post提交方式,博主第一次做的时候,不清楚这里面的机制,以为设置了enctype属性之后,获取表单的其他字段值还是和原来一样用request.getParameter()去获取,然后就杯具了,通过上网查找资料,发现原来不能这样子去获取值了,这里就给大家介绍一个普遍使用的方法
这里我们采用commons-fileupload-1.2.1.jar、commons-io-1.4.jar这两个jar包来做文件上传,
1 @SuppressWarnings("unchecked") 2 public Map<String, String> uploadPackage(HttpServletRequest request, HttpServletResponse response) 3 throws ServletException, IOException { 4 Map<String, String> params = new HashMap<String, String>(); 5 try 6 { 7 DiskFileItemFactory factory = new DiskFileItemFactory(); 8 ServletFileUpload upload = new ServletFileUpload(factory); 9 // 得到所有的表单域,它们目前都被当作FileItem 10 List<FileItem> items = upload.parseRequest(request); 11 Iterator<FileItem> iter = items.iterator(); 12 // 依次处理请求 13 while (iter.hasNext()) 14 { 15 FileItem item = iter.next(); 16 if (item.isFormField()) 17 {// 如果是普通的表单域 18 /* "处理普通表单内容 ... */ 19 String name = item.getFieldName(); 20 String value = new String(item.getString().getBytes("ISO-8859-1"), "utf-8"); 21 params.put(name, value); 22 } 23 else 24 { /* 如果是文件上传表单域 */ 25 // 1.获取文件名 26 String filename = item.getName(); 27 String suffix = filename.substring(filename.lastIndexOf(".")); 28 if (filename != null & !"".equals(filename)) 29 {// 如果有文件上传:是为修改操作作判断 30 // 2.先将上传文件保存到本地硬盘上 31 ServletContext context = this.getServletContext(); 32 String dir = ""; 33 if(".png".equals(suffix)){ 34 dir = context.getRealPath("uploadImgAndApp/icon"); 35 } 36 37 if(".jar".equals(suffix) || ".apk".equals(suffix)){ 38 dir = context.getRealPath("uploadImgAndApp/app"); 39 } 40 System.out.println(dir); 41 File file = new File(dir,filename); 42 //当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件 43 file.createNewFile(); 44 // 获得流,读取数据写入文件 45 InputStream in = item.getInputStream(); 46 FileOutputStream fos = new FileOutputStream(file); 47 int len = 0; 48 byte[] buffer = new byte[1024]; 49 // 3.获取本地文件的绝对路径 50 while ((len = in.read(buffer)) > 0){ 51 fos.write(buffer, 0, len); 52 } 53 // 关闭资源文件操作 54 fos.close(); 55 in.close(); 56 // 删除临时文件 57 item.delete(); 58 String filepath = dir + File.separator + filename; 59 60 new FtpUploadThread(filepath, "handbb_down", filename).run(); 61 62 //这里判断是图片还是jar或者apk文件 63 if(".png".equals(suffix)){ 64 params.put("icon_url", zsbDomainName + "/" + filename); 65 } 66 67 if(".jar".equals(suffix) || ".apk".equals(suffix)){ 68 params.put("download_url", zsbDomainName + "/" + filename); 69 } 70 // params.put("packagename", filename);// 文件名(上传包的名称) 71 // params.put("URL", zsbDomainName + File.separator + filename);// 文件在FTP的URL 72 73 // 7.删除本地文件 74 file.delete(); 75 } 76 else 77 {// 修改操作时,如果没有上传文件 78 params.put("packagename", "noFile"); 79 } 80 } 81 } 82 } 83 catch (Exception e) 84 { 85 e.printStackTrace(); 86 } 87 return params; 88 }
接下来我们来分析下该代码。
代码16行开始,就是通过item来判断是否是文件域还是普通域,如果普通域就执行
String name = item.getFieldName();
String value = new String(item.getString().getBytes("ISO-8859-1"), "utf-8");
params.put(name, value);这三行代码,这里通过key/value的形式将普通表单域存入map中,
如果是文件域,则执行文件上传操作,博主这里因为业务限制,所以有了33行和37行 的一些业务判断。
在文件上传的那个servlet中调用该方法,在doPost中调用
Map<String,String> params = this.uploadPackage(request, response);
同时在设置bean属性的时候,要根据属性类型进行相应的转化,因为map中存储的都是string类型

浙公网安备 33010602011771号