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类型

 

posted @ 2013-07-21 10:03  离尘  阅读(1180)  评论(0)    收藏  举报